2012-11-17 82 views
2

我正在嘗試將SendInput API用於熱鍵應用程序。所以我正在做的是有一個全局的keyhook,當一些keycombination命中我想發送另一個密鑰。SendInput ExtraInfo/Flags

我的問題是,當我發送模擬密鑰,然後我的鉤子收到該消息,我最終以遞歸循環。

因此,我嘗試過使用ExtraInfo/Flags,但由於某種原因,我設置的值與我在鉤子中收到的值不同。

var down = new INPUT(); 
down.Type = (UInt32)InputType.Keyboard; 
down.Data.Keyboard = new KEYBDINPUT(); 
down.Data.Keyboard.KeyCode = (UInt16)keyCode; 
down.Data.Keyboard.Scan = 0; 
down.Data.Keyboard.Flags = 0; //doesn't matter whatever I set here... never gets back to my hook 
down.Data.Keyboard.Time = 0; 
down.Data.Keyboard.ExtraInfo = IntPtr.Zero; //doesn't matter whatever I set here... never gets back to my hook 

不管我在ExtraInfo /標誌設置...它的復位,當我收到我的鉤消息:

private IntPtr KeyStateChangeCallback(int nCode, IntPtr wParam, ref KEYBDINPUT lParam) 
    { 
     //lParam.ExtraInfo and lParam.Flags ... is always some mumbo jumbo value or zero... 
    } 

我使用lowlevelkeyboard鉤,「WH_KEYBOARD_LL」與設置是這樣的:

 proc = KeyStateChangeCallback; 
     using (Process curProcess = Process.GetCurrentProcess()) 
     using (ProcessModule curModule = curProcess.MainModule) 
     { 
      hookID = NativeMethods.SetWindowsHookEx(WH_KEYBOARD_LL, proc, NativeMethods.GetModuleHandle(curModule.ModuleName), 0); 
     } 

其他人有類似的問題,可以幫我嗎?任何工作代碼示例將是太棒了:)

+0

你使用什麼樣的鉤子? – shf301

+0

謝謝:)我正在使用WH_KEYBOARD_LL鉤子,再次看看帖子 - 用附加信息更新它。 – user1831153

回答

1

根據documentation,您應該致電GetMessageExtraInfo獲取檢索ExtraInfo字段中的數據。

+0

謝謝,這實際上是我迄今爲止使用的解決方案,但我認爲將值與消息本身一起傳遞會更安全 - 因爲使用GetMessageExtraInfo需要使用無法使用的SetMmessageExtraInfo在「每個輸入」的基礎上......僅在整個消息上,而消息可以由多個輸入組成,「按鍵」例如 - 「按鍵A下」,「按鍵B下」,「按鍵A」等。 ..和Flags有關的問題呢?顯然沒有設置/獲取組合的權利? – user1831153

+0

嗯,它似乎可以在x64模式下運行應用程序時發送ExtraInfo,但不能在x86中運行。 (電腦也是X64)所以看起來其中一個結構是不正確的......但我無法弄清楚哪些...... – user1831153