2009-12-28 35 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#中的低級別鍵盤鉤子上是一個很好的技巧。這可能會導致你缺少一些東西。