局域网远程控制息屏功能程序

mfk 11小时前 37

在AI的全力帮助下,完成的一个局域网远程控制息屏功能程序。

纯编程小白 ,通过论坛边学边试验,感谢这个论坛。



程序代码如下:

import win.ui;
import console;
import wsock.tcp.simpleHttpServer;
import inet.adapter;
import process;
/*DSG{{*/
var winform = win.form(text="远程屏幕控制服务器";right=500;bottom=320)
winform.add(
edit={cls="edit";left=20;top=20;right=480;bottom=280;edge=1;multiline=1;readonly=1;vscroll=1;z=1}
)
/*}}*/



// 获取本机局域网IP地址
var localIp = "";
for adptInfo in inet.adapter.each() {
    // 获取有效的非回环IP地址
    if(adptInfo.currentIpAddress 
        and adptInfo.currentIpAddress != "127.0.0.1"
        and adptInfo.currentIpAddress != ""
        and string.find(adptInfo.description, "Virtual") == null
        and string.find(adptInfo.description, "VMware") == null
        and string.find(adptInfo.description, "VirtualBox") == null) {
        localIp = adptInfo.currentIpAddress;
        break;
    }
}
if(localIp == "") localIp = "127.0.0.1";

// 屏幕控制函数
var screenControl = {
    // 关闭显示器(息屏)
    turnOff = function() {
        try {
            ::User32.SendMessage(0xFFFF, 0x0112, 0xF170, 2); // WM_SYSCOMMAND, SC_MONITORPOWER
            return true;
        } catch(e) {
            return false;
        }
    };
     
    // 低功耗模式(睡眠)
    sleep = function() {
        try {
            ::User32.SendMessage(0xFFFF, 0x0112, 0xF140, 2); // SC_MONITORPOWER 低功耗
            return true;
        } catch(e) {
            return false;
        }
    };
}

// 启动 HTTP 服务端
var server = wsock.tcp.simpleHttpServer("0.0.0.0", 8081);

console.open();

//winform.show();

console.log("========================================");
console.log("🖥️  远程屏幕控制服务器已启动");
console.log("========================================");
console.log("本地访问地址: http://127.0.0.1:8081");
console.log("局域网访问地址: http://", localIp, ":8081");
console.log("========================================");
console.log("关闭此窗口即服务停止");

// 在界面上显示服务器信息
winform.edit.print("========================================");
winform.edit.print("🖥️  远程屏幕控制服务器已启动");
winform.edit.print("========================================");
winform.edit.print("");
winform.edit.print("📱 访问地址:");
winform.edit.print("   本地访问: http://127.0.0.1:8081");
winform.edit.print("   局域网访问: http://" + localIp + ":8081");
winform.edit.print("");
winform.edit.print("📋 功能说明:");
winform.edit.print("   🔴 息屏 - 关闭显示器");
winform.edit.print("");
winform.edit.print("💡 提示:");
winform.edit.print("   - 息屏后可通过亮屏按钮唤醒");
winform.edit.print("   - 部分电脑可能需要移动鼠标唤醒");
winform.edit.print("   - 关闭此窗口即可停止服务");
winform.edit.print("");
winform.edit.print("========================================");

// 在后台线程中运行服务器
        server.run(
            function(response, request){
                // 屏幕控制函数(在线程内重新定义)
                var screenCtrl = {
                    turnOff = function() {
                        try {
                            ::User32.SendMessage(0xFFFF, 0x0112, 0xF170, 2);
                            return true;
                        } catch(e) {
                            return false;
                        }; 
                     };           
            };    
                // 处理API请求
                if( request.path == "/api/turnOff" ){
                    var result = screenCtrl.turnOff();
                    response.write('{"success":' + tostring(result) + ',"action":"turnOff"}');
                    return;
                }
                
                
                // 响应网页内容
                response.write(`
                <!doctype html>
                <html>
                <head>
                    <meta charset="utf-8">
                    <meta name="viewport" content="width=device-width,initial-scale=1">
                    <title>局域网远程屏幕息屏</title>
                    <style>
                        * {
                            margin: 0;
                            padding: 0;
                            box-sizing: border-box;
                        }
                        
                        body {
                            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
                            background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
                            min-height: 100vh;
                            display: flex;
                            justify-content: center;
                            align-items: center;
                            padding: 20px;
                        }
                        
                        .container {
                            background: white;
                            border-radius: 30px;
                            padding: 40px;
                            box-shadow: 0 25px 50px rgba(0,0,0,0.3);
                            text-align: center;
                            max-width: 500px;
                            width: 100%;
                            animation: fadeIn 0.5s ease-out;
                        }
                        
                        @keyframes fadeIn {
                            from {
                                opacity: 0;
                                transform: translateY(20px);
                            }
                            to {
                                opacity: 1;
                                transform: translateY(0);
                            }
                        }
                        
                        h1 {
                            color: #1e3c72;
                            margin-bottom: 10px;
                            font-size: 28px;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            gap: 10px;
                        }
                        
                        .subtitle {
                            color: #666;
                            margin-bottom: 30px;
                            font-size: 14px;
                            border-bottom: 2px solid #e0e0e0;
                            padding-bottom: 20px;
                        }
                        
                        .screen-icon {
                            font-size: 120px;
                            margin: 20px 0;
                            transition: transform 0.3s;
                        }
                        
                        .control-buttons {
                            display: flex;
                            gap: 15px;
                            margin: 30px 0;
                            justify-content: center;
                            flex-wrap: wrap;
                        }
                        
                        button {
                            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                            color: white;
                            border: none;
                            padding: 14px 28px;
                            border-radius: 50px;
                            cursor: pointer;
                            font-size: 16px;
                            font-weight: 600;
                            transition: all 0.3s;
                            display: inline-flex;
                            align-items: center;
                            gap: 8px;
                            box-shadow: 0 4px 15px rgba(0,0,0,0.2);
                        }
                        
                        button:hover {
                            transform: translateY(-2px);
                            box-shadow: 0 8px 25px rgba(0,0,0,0.3);
                        }
                        
                        button:active {
                            transform: translateY(0);
                        }
                        
                        .turn-off-btn {
                            background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
                        }
                        
                        .turn-off-btn:hover {
                            background: linear-gradient(135deg, #e07ae9 0%, #e4455a 100%);
                        }
                        
                        .turn-on-btn {
                            background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
                        }
                        
                        .info-card {
                            background: #f8f9fa;
                            border-radius: 15px;
                            padding: 15px;
                            margin-top: 20px;
                            text-align: left;
                        }
                        
                        .info-item {
                            display: flex;
                            justify-content: space-between;
                            padding: 8px 0;
                            border-bottom: 1px solid #e0e0e0;
                            font-size: 14px;
                        }
                        
                        .info-item:last-child {
                            border-bottom: none;
                        }
                        
                        .info-label {
                            color: #666;
                            font-weight: 500;
                        }
                        
                        .info-value {
                            color: #1e3c72;
                            font-weight: 600;
                            font-family: monospace;
                        }
                        
                        .status-message {
                            margin-top: 20px;
                            padding: 12px;
                            border-radius: 10px;
                            font-size: 14px;
                            transition: all 0.3s;
                        }
                        
                        .status-success {
                            background: #d4edda;
                            color: #155724;
                            border: 1px solid #c3e6cb;
                        }
                        
                        .status-error {
                            background: #f8d7da;
                            color: #721c24;
                            border: 1px solid #f5c6cb;
                        }
                        
                        .status-warning {
                            background: #fff3cd;
                            color: #856404;
                            border: 1px solid #ffeeba;
                        }
                        
                        .warning-text {
                            font-size: 12px;
                            color: #f5576c;
                            margin-top: 15px;
                            padding: 10px;
                            background: #fff3cd;
                            border-radius: 8px;
                        }
                        
                        @media (max-width: 600px) {
                            .container {
                                padding: 30px 20px;
                            }
                            
                            button {
                                padding: 12px 20px;
                                font-size: 14px;
                            }
                            
                            .screen-icon {
                                font-size: 80px;
                            }
                        }
                    </style>
                </head>
                <body>
                    <div class="container">
                        <h1>
                            🖥️ 远程屏幕息屏
                        </h1>
                        <div class="subtitle">
                            通过局域网控制服务器显示器
                        </div>
                        
                        <div class="screen-icon" id="screenIcon">
                            💻
                        </div>
                        
                        <div class="control-buttons">
                            <button class="turn-off-btn" onclick="turnOff()">
                                🔴 息屏
                            </button>
                        </div>
                        
                        <div class="info-card">
                            
                            <div class="info-item">
                                <span class="info-label">🔌 连接状态</span>
                                <span class="info-value" id="connectionStatus">✅ 已连接</span>
                            </div>
                            
                        </div>
                        
                        <div id="statusMessage" class="status-message" style="display:none;"></div>
                        
                        <div class="warning-text">
                            ⚠️ 提示:息屏后需要移动鼠标或点击亮屏按钮才能唤醒屏幕<br>
                            部分笔记本电脑可能需要按键盘任意键唤醒
                        </div>
                    </div>
                    
                    <script>
                        let currentAction = null;
                        let actionTimeout = null;
                        
                        function showMessage(message, type) {
                            const msgDiv = document.getElementById('statusMessage');
                            msgDiv.textContent = message;
                            msgDiv.className = 'status-message status-' + type;
                            msgDiv.style.display = 'block';
                            
                            if (actionTimeout) clearTimeout(actionTimeout);
                            actionTimeout = setTimeout(() => {
                                msgDiv.style.display = 'none';
                            }, 3000);
                        }
                        
                        function updateLastAction(action) {
                            const now = new Date();
                            const timeStr = now.toLocaleTimeString();
                            document.getElementById('lastAction').innerHTML = action + ' (' + timeStr + ')';
                            
                            // 更新图标动画
                            const icon = document.getElementById('screenIcon');
                            icon.style.transform = 'scale(1.1)';
                            setTimeout(() => {
                                icon.style.transform = 'scale(1)';
                            }, 300);
                        }
                        
                        async function turnOff() {
                            if (currentAction) return;
                            currentAction = 'turnOff';
                            
                            try {
                                showMessage('正在发送息屏指令...', 'warning');
                                
                                const response = await fetch('/api/turnOff');
                                const data = await response.json();
                                
                                if (data.success) {
                                    showMessage('✅ 屏幕已关闭(息屏)', 'success');
                                    updateLastAction('息屏');
                                    document.getElementById('screenIcon').innerHTML = '🔴';
                                } else {
                                    showMessage('❌ 息屏指令执行失败', 'error');
                                }
                            } catch (error) {
                                console.error('Error:', error);
                                showMessage('❌ 网络连接失败,请检查服务器状态', 'error');
                            } finally {
                                currentAction = null;
                            }
                        }
                        
                        
                        // 定期检查服务器状态
                        async function checkServerStatus() {
                            try {
                                const response = await fetch('/api/status');
                                if (response.ok) {
                                    document.getElementById('connectionStatus').innerHTML = '✅ 已连接';
                                    document.getElementById('connectionStatus').style.color = '#28a745';
                                } else {
                                    throw new Error('Server error');
                                }
                            } catch (error) {
                                document.getElementById('connectionStatus').innerHTML = '❌ 连接断开';
                                document.getElementById('connectionStatus').style.color = '#dc3545';
                            }
                        }
                        
                        // 每10秒检查一次服务器状态
                        setInterval(checkServerStatus, 10000);
                        checkServerStatus();
                        
                        
                        // 防重复提交
                        let isSubmitting = false;
                        const originalTurnOff = turnOff;
                        const originalTurnOn = turnOn;
                        
                        window.turnOff = async function() {
                            if (isSubmitting) return;
                            isSubmitting = true;
                            await originalTurnOff();
                            isSubmitting = false;
                        };
                          
                    </script>
                </body>
                </html>
                `);
            }
        );
        

// 自动打开默认浏览器
//process.execute("http://127.0.0.1:8081");


// 窗口关闭时停止服务器
winform.onClose = function(hwnd) {
    server.stop();
    winform.close();
}

win.loopMessage();




最新回复 (1)
  • 我高兴 9小时前
    0 2
    高手!
返回