2012-12-04 175 views
-1

我正在處理一些模擬按鍵的代碼。一切工作正常,我可以看到按鍵按預期(現在用Capslock/Numlock測試,所以我可以看到鍵盤上的LED)。但是,爲了我的需要,我需要能夠100%地分辨出是否按下了這些按鍵。我的應用程序很奇怪,所以我決定以較小的規模再現問題,並且發現了一件非常奇怪的事情。函數IsKeyLocked不會返回我期望的結果。IsKeyLocked返回奇怪的結果

讓我們有這樣的代碼:

按壓鍵
private void btnPressButton_Click(object sender, EventArgs e) 
    { 
     KeyboardManager.PressKey(KeyCode.CapsLock); 

     lblKeyboardState.Text = IsKeyLocked(Keys.CapsLock).ToString(); 
    } 

方法:

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

    public static void PressKey(KeyCode keyCode) 
    { 
     byte code = (byte)keyCode; 

     keybd_event(code, 0, KEYEVENTF_KEYDOWN, 0); 
     keybd_event(code, 0, KEYEVENTF_KEYUP, 0); 
    } 

有人會想到,這第一個按鈕點擊後,其結果將是TRUE(大寫鎖定WASN當我運行應用時沒有按下)。但即使我的鍵盤上的LED發光,它也是假的。當我再次按下按鈕時,結果爲True,但LED不再閃爍。爲什麼這個函數返回錯誤的結果?我錯過了什麼或...?

根據MSDN文檔:

確定Caps Lock,Num Lock或Scroll Lock鍵是 效果。

如果這是一個真實的陳述,這裏實際發生了什麼?如何從C#獲得100%可靠的答案,無論caplock/numlock是否有效?

回答

1

我相信你看到這種行爲的原因是因爲你的代碼設置了CapsLock的狀態,然後在應用程序中發生Caps鍵鎖定事件之前檢查狀態。您可以通過在設置CapsLock狀態和檢查代碼之間添加DoEvents()語句來正確地創建示例代碼函數。

private void btnPressButton_Click(object sender, EventArgs e) 
{ 
    KeyboardManager.PressKey(KeyCode.CapsLock); 
    Application.DoEvents(); 
    lblKeyboardState.Text = IsKeyLocked(Keys.CapsLock).ToString(); 
} 
+0

這應該包含在msdn文檔中!非常感謝你。 – walther