キーの押下をシミュレートするコードを使用しています。すべてが正常に機能しており、期待どおりにキーが押されていることがわかります(現時点では、Capslock / Numlockでテストしているため、キーボードのLEDが表示されます)。ただし、私のニーズには、これらのキーが押されたかどうかを100%伝えることができる必要があります。私のアプリは奇妙に動作するので、問題をより小さなスケールで再現することにしましたが、非常に奇妙なことがわかりました。関数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になると予想されます(アプリを実行したときにCapslockが押されていませんでした)。しかし、キーボードのLEDが光っていても、それは誤りです。もう一度ボタンを押すと、結果はTrueになりますが、LEDが点灯しなくなります。この関数が間違った結果を返すのはなぜですか?私は何かが足りないのですか...?
msdnのドキュメントによると:
CAPS LOCK、NUM LOCK、またはSCROLLLOCKキーが有効かどうかを判別します。
これが本当の声明である場合、実際にここで何が起こりますか?capslock / numlockが有効であるかどうかに関係なく、C#から100%信頼できる回答を得るにはどうすればよいですか?