2014-01-30 228 views
0

我通過模擬按下Ctrl鍵按鈕模擬按住Ctrl鍵同時按下

[DllImport("user32.dll")] 
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 

keybd_event(VK_CONTROL, 0, 0, 0); //key down 
/* Stuff which needs ctrl to be pressed is done here */ 
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); //key up 

此代碼位於一個.dll文件。該DLL在WPF應用程序中使用。現在我有奇怪的行爲,按下Ctrl鍵只有在WPF窗口未處於活動狀態時才被識別。這意味着當我點擊另一個窗口來取消激活WPF窗口並強制運行代碼而不再激活WPF窗口時,它將起作用。點擊WPF窗口後,它不再工作。

任何想法這裏的問題是什麼?

編輯: 我將代碼從DLL移動到wpf應用程序,它沒有任何改變。在WPF應用程序我測試:

keybd_event(VK_CONTROL, 0, 0, 0); 
child.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); 
+0

你爲什麼用這個DLL導入? – ThaMe90

+0

因爲我正在使用它反正一些其他的東西。但我嘗試了不同的解決方案來提高關鍵事件的發生。所有解決方案都導致了相同的行爲。 – andineupert

+0

'keybd_event'是異步的。使用'SetKeyboardState'。除了指令VL_CONTROL(設置爲-128或0x80)外的所有256字節設置爲0。同步後再次使用到0 RaiseEvent – manuell

回答

0

manuell提到的解決方案,並在我的問題的第三點意見說明了問題:

keybd_event是異步的。使用SetKeyboardState。除了指令VL_CONTROL(設置爲-128或0x80)外的所有256字節設置爲0。所有的再次使用,以0同步後的RaiseEvent - manuell

Joe Whites說明一點,並提出了一個潛在的很好的解決方案也:

manuell使有關keybd_event是異步的,好點 - 你跟隨它調用RaiseEvent,我相信它是同步的。所以你應該在你的應用程序有機會處理「CTRL被按下」消息之前調用你的事件。嘗試在Dispatcher.BeginInvoke中包裝RaiseEvent調用(即,在處理「CTRL被按下」消息之後註冊回調以運行)並查看是否解決了您的問題。 - Joe White

謝謝!