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

mfk 22天前 353

在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();




最新回复 (9)
  • 我高兴 22天前
    0 2
    高手!
  • 平凡人生2 20天前
    0 3
  • 光庆 20天前
    0 4

  • 光庆 20天前
    0 5
    import win.ui;
    /*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}
    )
    /*}}*/
    winform.show()
    thread.invoke(function(winform){
    	import win.ui;	
    	import wsock.tcp.simpleHttpServer;
    	import inet.adapter;
    	import process;
    	// 获取本机局域网IP地址
    	var localIp = wsock.getLocalIp();
    	// 启动 HTTP 服务端
    	var server = wsock.tcp.simpleHttpServer("0.0.0.0", 8081);
    	// 在界面上显示服务器信息
    	winform.edit.print(`
    ========================================
    	 🖥️  远程屏幕控制服务器已启
     ========================================
    	 📱 访问地址:
    	    本地访问: http://127.0.0.1:8081;
    	    局域网访问: http://` + localIp + `:8081
    	 📋 功能说明:
    	    🔴 息屏 - 关闭显示器
    	 💡 提示:
    	    - 息屏后可通过亮屏按钮唤醒
    	    - 部分电脑可能需要移动鼠标唤醒
    	    - 关闭此窗口即可停止服务
     ========================================
    	`)
    	winform.show()
    	
    	// 在后台线程中运行服务器
    	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>
        		`);
    		}
    	);
            	
    	// 窗口关闭时停止服务器
    	winform.onClose = function(hwnd) {
        	server.stop();
    	}
    	
    	// 线程驻留
    	while(true){
    		thread.delay(1);
    	}
    	
    },winform);
    
    win.loopMessage();


  • mfk 20天前
    0 6
    光庆 import&nbsp;win.ui; /*DSG{{*/ var&nbsp;winform&nbsp;=&nbsp;win.form(text=&quot ...
    光庆大佬 牛,修改后的更专业方便了。
  • mfk 20天前
    0 7
    光庆 import&nbsp;win.ui; /*DSG{{*/ var&nbsp;winform&nbsp;=&nbsp;win.form(text=&quot ...
    还想问一下如何写一个站点目录-例如WWW目录下一个带DATA.DB数据库的站点,被局域网访问 的实例
  • 光庆 19天前
    0 8
    mfk 还想问一下如何写一个站点目录-例如WWW目录下一个带DATA.DB数据库的站点,被局域网访问  的实例

    简单写了一下,见:https://aar.chengxu.online/thread-827.htm

  • mfk 19天前
    0 9
    谢谢
  • Mr_MAO 16天前
    1 10
    楼主代码中【line46】让电脑处于sleep的API参数可能不对,我记得是:::User32.SendMessage(0xFFFF, 0x0112, 0xF170, 1 /* low power*/);
返回