2012-09-20 43 views
0

我在c#中使用winapi發送組合鍵時出現了一個奇怪的問題。 我的目標是創建一個發送兩個密鑰的方法f.e. SHIFT + HOME:如何使用WinAPI在c#中發送組合鍵後創建虛擬鍵

private const int WM_KEYDOWN = 0x0100; 
private const int WM_KEYUP = 0x0101; 

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

public static void SendKey(byte key1, byte key2) 
{ 
     //SHIFT down 
     keybd_event(key1, 0, WM_KEYDOWN, UIntPtr.Zero); 
     //press HOME 
     keybd_event(key2, 0, WM_KEYDOWN, UIntPtr.Zero); 
     keybd_event(key2, 0, WM_KEYUP, UIntPtr.Zero); 
     //SHIFT up 
     keybd_event(key1, 0, WM_KEYUP, UIntPtr.Zero); 
} 

問題是在方法結束執行後仍然按下key1(SHIFT)。換句話說,附加的方法調用將從上次運行中按下SHIFT開始。 它看起來非常簡單,但我找不到解決方案使其工作。我查看了許多相關的SO問題並嘗試了它們,但問題仍然存在。任何幫助表示讚賞。

+0

錯誤的標誌。 WM_KEYDOWN = 0,WM_KEYUP = KEYEVENTF_KEYUP。贊成SendInput()代替,你可以拋出一個異常,當它返回0. –

回答

1

檢查keybd_event documentation!特別是第三個參數的標誌。 在你的代碼中,你一直按下每個鍵兩次而不釋放。

將您的窗口消息常量替換爲KEYEVENTF_KEYUP (0x2)以降低並簡化爲keydown的零。

你也可以看看.NETs SendKeys class.

+0

我已經取代了你建議的常量,但SHIFT + HOME仍然不能發送到一起。實際上第一個鍵是上下鍵,然後是第二個鍵 - 上下鍵。我又錯過了一些東西。 – Vitalliuss

相關問題