在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)
-
-
-
-
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
还想问一下如何写一个站点目录-例如WWW目录下一个带DATA.DB数据库的站点,被局域网访问 的实例 -
-




