-1

キーの押下をシミュレートするコードを使用しています。すべてが正常に機能しており、期待どおりにキーが押されていることがわかります(現時点では、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%信頼できる回答を得るにはどうすればよいですか?

4

1 に答える 1

1

この動作が見られる理由は、コードがCapsLockの状態を設定し、アプリケーションでCapsKeyロックのイベントが発生する前に状態をチェックするためだと思います。CapsLock状態の設定とチェックの間にDoEvents()ステートメントをコードに追加するだけで、サンプルコードを正しく機能させることができます。

private void btnPressButton_Click(object sender, EventArgs e)
{
    KeyboardManager.PressKey(KeyCode.CapsLock);
    Application.DoEvents();
    lblKeyboardState.Text = IsKeyLocked(Keys.CapsLock).ToString();
}
于 2012-12-04T16:23:54.837 に答える