Windows下通过代码关闭显示器时WinAPI返回0无效果如何解决
代码问题诊断与修复方案
- 核心错误:你使用了错误的消息接收窗口句柄。
SC_MONITORPOWER属于全局系统命令消息,必须发送给所有顶层窗口(对应常量HWND_BROADCAST,值为0xFFFF)才能被系统电源管理模块响应。你向桌面窗口句柄GetDesktopWindow()发送该消息,不会触发任何电源操作,因此返回值为0但无实际效果。 - 次要影响因素:Win10 1809及后续版本、Win11系统会拦截后台进程发送的关屏消息,只有前台进程发送的该消息才会被执行,避免恶意程序随意操作用户显示设备。
修复后可运行代码
class Program { [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); const int SC_MONITORPOWER = 0xF170; const int WM_SYSCOMMAND = 0x0112; const int MONITOR_OFF = 2; // 全局广播窗口常量 const int HWND_BROADCAST = 0xFFFF; static void Main(string[] args) { SendMessage( (IntPtr)HWND_BROADCAST, WM_SYSCOMMAND, (IntPtr) SC_MONITORPOWER, (IntPtr) MONITOR_OFF); } }
额外注意事项
- 如果修复后运行仍无效果,可以尝试给程序添加管理员权限运行,部分系统安全策略会限制普通用户进程发送全局系统命令。
- 关屏后移动鼠标、按下任意按键即可正常唤醒屏幕,符合系统默认的电源行为。
内容的提问来源于stack exchange,提问作者Darren Oakey
相关产品推荐
相关产品推荐

