关闭远程PC上的显示屏

时间:2010-05-26 07:46:42

标签: c++ windows drivers ioctl

我正在修复Windows中用于远程控制(类似远程桌面)的应用程序中的一些错误。 并且有一项功能是你可以在远程机器上进行空白屏幕 - 所有程序都保持运行不受影响,但是在远程PC上查看显示器的人只能看到黑屏。

通过发送未记录的IoCtl请求IOCTL_VIDEO_SET_OUTPUT_DEVICE_POWER_STATE来实现。此请求不适用于Vista及更高版本。

还有其他方法可以做我想要的吗?

事实上,SendMessage(-1,WM_SOMMAND,SC_MONITORPOWER,2)可以解决问题,但如果有人用键盘/鼠标,屏幕会重新开启。

2 个答案:

答案 0 :(得分:1)

您应该能够将SC_MONITORPOWER设置为2发送WM_SYSCOMMAND。不幸的是,我不在具有测试能力的计算机上,所以我没有尝试过。

我相信无论何时触摸鼠标/键盘,Windows都会尝试再次唤醒,但您应该能够捕获这些消息并重新发送2.

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch (msg){
        ...
        case WM_SYSCOMMAND:
            switch (wParam){
                case SC_MONITORPOWER:
                return 2;
            }
        break;
        ...
    }
}

请注意,这未经过测试。

答案 1 :(得分:0)

您可以尝试使用低级键盘和鼠标挂钩(远程桌面应用应该已经有)。确保它是低级别,即SetWindowsHookEx(WH_KEYBOARD_LL)和SetWindowsHookEx(WH_MOUSE_LL)。

在钩子回调函数中:

  • 请勿致电CallNextHookEx()
  • LowLevelKeyboardProc中的
  • 返回-1 (您必须实现)。对LowLevelMouseProc做同样的事情。

警告:这将禁用键盘(即使它无法正常工作),直到您的代码调用CallNextHookEx()并在回调过程中返回0。