3

我正在尝试做一个像 Skype 这样的客场计时器风格的东西。如果用户“离开”了一段时间,我会触发一些东西。我一直在将 SetWindowsHookEx() 与 WM_KEYBOARD_LL 一起使用,效果很好。直到您打开 RDC 连接并使其全屏显示。然后我永远不会得到键盘事件。

有人遇到过这个吗?或者知道实现这一目标的更好方法?我实际上已经测试了Skype,并且使用全屏RDC,如果我输入RDC,它将正确地从Away转到Online。

谢谢

编辑:在 Raymond Chen 发表评论后,我做了一些测试,他是对的。不敢相信我经过所有的搜索后从未找到这种方法。它还解决了我遇到的 WPF 应用程序未触发 LL_Mouse/KEYBOARD 事件的问题。

再次感谢。基于此更新我接受的答案。如果您需要做 LL_MOUSE/KWYBOARD,另一个答案仍然很好。

4

2 回答 2

3

看看GetLastInputInfo()。尝试定期调用它。

于 2013-01-30T20:59:38.987 回答
2

是的。您不会在远程桌面中按下按键。我遇到了这个问题,我找到的唯一解决方案是:

使用 FindWindow API 总是寻找 RDP 窗口,如果您检测到已创建全屏 RDP 窗口,您应该这样做:

a) 解开所有挂钩。b) 重置所有挂钩。

因此,创建一个调用 SetWindowHookEx API 的函数并将其称为 SetHook 和另一个作为 UnHook 函数。然后在您发现用户进入远程桌面时重新调用他们两个。

现在,即使在远程桌面连接中,您也可以按下按键。

我找到了我的旧代码,我做了这样的事情:

创建了一个 1 秒的计时器。然后

std::string tmp;
HWND hParent = ::FindWindow(TEXT("TSHELLHWND"), NULL);
GetWindowString(hParent, tmp);

ix = za.find(" - Remote Desktop");

if (hParent != NULL && ix != string::npos)
RestartHook();

当您重新启动钩子时,您还应该设置一个全局变量,否则它将一直重新启动钩子。当窗口关闭时,您可以重置该全局变量。

于 2013-01-30T03:22:33.197 回答