SetWindowsHookEx()WM_KEYBOARD_LL没有通过全屏RDC

时间:2013-01-30 03:19:17

标签: winapi setwindowshookex

我正在尝试做像Skype这样的计时器式的东西。如果用户“离开”一段时间,我会触发某些事情。我一直在使用带有WM_KEYBOARD_LL的SetWindowsHookEx()工作正常。这是直到您打开RDC连接并全屏显示。然后我从未得到键盘事件。

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

由于

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

再次感谢。根据此更新我接受的答案。如果你需要做LL_MOUSE / KWYBOARD,另一个答案仍然是好的。

2 个答案:

答案 0 :(得分:3)

看看GetLastInputInfo()。尝试定期打电话。

答案 1 :(得分: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();

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