2011-09-20 135 views
0

我搜索注册全局热键的方法,所以我可以在按键时触发一个方法。在Windows CE中注册全局热键

它需要与Windows CE和Windows Mobile> = 5一起使用。

[编辑:它也需要工作,当应用程序被隐藏和/或形式没有焦点]

+0

我发现奇怪的是'RegisterHotkey'不起作用。它是专门为全球热键而设计的,当你的应用程序没有焦点时,它可以工作。 – CodesInChaos

回答

1

如果RegisterHotKey由于某种原因未能做到您想要的,请将其放入keyboard hook。挂钩不是“正式”支持的,但对于键盘,它们工作得很好。

+0

如果'RegisterHotkey'有效,我会避免这种情况。如果因为某些原因无法使用RegisterHotkey,这只是最后一招。如果这是一个桌面应用程序,我会低估,但我不知道WinCE是否有必要在那里。 – CodesInChaos

+0

当然,他应该尝试RegisterHotKey。不知道你最初对SetWindowsHook的反感是什么,但是为Windows CE设备开发了十多年,我知道我会走哪条路。 – ctacke

+0

低级别键盘钩子的问题在于,所有键盘输入都需要经过它,并且可能由于线程不能很快响应而延迟。举一个例子,我完全认为这是一个愚蠢地使用高优先级的游戏,并且饿死了另一个具有低级别键盘钩子的程序。这导致了多秒输入滞后。我自己使用了LL键盘钩子,但只在'RegisterHotkey'不是选项的情况下。 – CodesInChaos

1

您可以使用coredll定义RegisterHotKey功能。在devbuzz论坛上,您可以找到一个帖子,名称为:code for c# hotkey register/unregister其中显示了一个实现

另一种方法是运行一个单独的线程并在具有可接受的休眠时间的循环中调用GetAsyncKeyStateGetAsyncKeyState应该独立于键盘焦点。

+0

也尝试了这一点,但它在应用程序在后台运行时不起作用。 – mabstrei

+0

我已经更新了包含GetAsyncKeyState的答案 – 2011-09-20 08:49:56

+2

'GetAsyncKeyState'是一个可疑的选择。例如,它不能查看是否同时按下了多个组合键,这会导致意外触发。至少在桌面窗口中还有其他问题,例如检查热键的代码不会被识别为应用程序可以从当前前台程序窃取焦点的地方。 – CodesInChaos

0

可以使用RegisterHotKey功能

注意:此API是完整的Windows CE操作系统软件包的一部分,由微软提供。特定平台的功能由原始设备制造商(OEM)确定,某些设备可能不支持此API。