当前位置:  开发笔记 > 编程语言 > 正文

不在焦点时响应键盘?(C#,Vista)

如何解决《不在焦点时响应键盘?(C#,Vista)》经验,为你挑选了2个好方法。

我正在尝试编写一个应用程序,只要按下Shift键就会响应,无论当前哪个应用程序都有焦点.

我尝试使用SetWindowsHookEx()和使用GetKeyboardState(),但这两个只在应用程序的窗口具有焦点时才起作用.我需要它在全球范围内工作.

我该怎么做呢?



1> Hans Passant..:

你必须使用SetWindowsHookEx().您可以使用托管语言WH_KEYBOARD_LL和WH_MOUSE_LL实现两种类型的挂钩.所有其他挂钩都需要一个可以注入另一个进程的DLL.无法注入托管DLL,无法初始化CLR.

这篇博文有一个功能性的例子.



2> Timwi..:

提供的答案都没有帮助我解决我的问题,但我自己找到了答案.这里是.

使用SetWindowsHookEx()with WH_KEYBOARD_LL是正确的方法.但是,其他参数SetWindowsHookEx()不直观:

最后一个参数dwThreadId需要为0.

倒数第二个参数hMod需要指向某个DLL.我用过 User32,这是一个始终加载的DLL,并且所有进程都使用GUI.我从CodeProject的帖子中得到了这个想法.

因此,代码看起来有点像这样:

instance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);

关于倒数第二个参数的文档不清楚.它说:

如果挂钩过程位于与当前进程关联的代码中,则必须将hMod参数设置为NULL [...].

它并未声明这仅适用于某些类型的钩子,而不适用于WH_KEYBOARD_LLWH_MOUSE_LL.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有