2009-12-28 127 views
1

无论用户何时按下“window key + s”,我都需要我的WPF应用程序获得焦点。WPF应用程序中的全局KeyHook

我的解决方案是用SetWindowsHookEx钩住键盘事件。但是我得到的回报手柄始终是0,当我打电话给GetLastWin32Error值也为0(即因此它实际上报告说,以前操作成功)

_hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, _hookFunction, _hinstance, 0); 
if (_hookHandle == IntPtr.Zero) 
throw new Win32Exception(Marshal.GetLastWin32Error()); 

(不用说,_hinstance具有有效价值等_hookFunction)

任何想法?其他方案?

谢谢。

+0

你能提供给您的P/Invoke签名和WH_KEYBOARD_LL的价值? – SwDevMan81 2009-12-28 16:13:53

+0

[DllImport(“user32.dll”,SetLastError = true)] private static extern IntPtr SetWindowsHookEx(HookType code,HookProc func,IntPtr instance,int threadID); WH_KEYBOARD_LL = 13 – Eden 2009-12-28 17:59:10

回答

1

尝试使用该工具来获取HINSTANCE:

Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); 
+0

这是我正在使用的确切代码,它会返回一个有效值。 – Eden 2009-12-28 18:00:33

0

如果你只需要为处理特定的组合键,然后最好是使用热键。这显示了如何设置热键:Hotkeys

+0

这显示了如何在WPF中挂钩WndProc:http://blogs.msdn.com/nickkramer/archive/2006/03/18/554235.aspx – Giorgi 2009-12-28 16:21:35

+0

除非我遗漏了一些东西,否则挂入WndProc只能拦截消息我的窗口是活动的。我的所有观点都是在用户在另一个窗口中工作时获得焦点? 我弄错了吗? – Eden 2009-12-28 18:03:44

+0

在winforms WndProc总是拦截按摩。我相信它在WPF中以相同的方式工作。 – Giorgi 2009-12-28 18:14:28

0

Here在C#中的低级别键盘钩子上是一个很好的技巧。这可能会导致你缺少一些东西。