簡體   English   中英

如何判斷何時按下/釋放修飾鍵

[英]How to tell when modifier keys are pressed/released

我希望能夠知道何時按下或釋放修改后的鍵( CtrlShift )。

基本上,用戶可以在按下修飾鍵的情況下執行多次擊鍵,並且在釋放之前我不想執行操作(想想EmacsCtrl + X + S )。

我試圖用 PreviewKeyUp 和 PreviewKeyDown 來做到這一點,但這似乎處理普通鍵而不是修飾符。 一旦我在事件中,我就可以判斷修改鍵是否被按下,但我無法判斷修改鍵是否在事件之間被釋放和重新按下。

protected override void OnPreviewKeyDown(KeyEventArgs e)
{
    // I just picked that key for a sample
    case Key.Tab:
        if (Keyboard.IsKeyDown(Key.LeftShift) ||
            Keyboard.IsKeyDown(Key.RightShift))
        {
            DoMyStuff();
        }


    // Similar things for Ctrl:

       if (Keyboard.IsKeyDown(Key.LeftCtrl) ||
           Keyboard.IsKeyDown(Key.RightCtrl))
        {
            ....
        }

我剛剛意識到Key.LeftShift等存在。 所以我可以在按下時設置一個標志,並在釋放鍵時檢查該標志。

最簡單的方法是執行此操作,無論何時您想獲取按下了哪些修飾符。

var kb = new Microsoft.VisualBasic.Devices.Keyboard();

var alt = kb.AltKeyDown;
var ctrl = kb.CtrlKeyDown;
var shift = kb.ShiftKeyDown;

你可以用它制作一個方法,所以它會更容易使用,就像這樣:

using Microsoft.VisualBasic.Devices;

...

private static readonly Keyboard KEYBOARD = new Keyboard();

private static Keys GetPressedModifiers()
{
    var mods = Keys.None;

    if (KEYBOARD.AltKeyDown)
    {
        mods |= Keys.Alt;
    }

    if (KEYBOARD.CtrlKeyDown)
    {
        mods |= Keys.Control;
    }

    if (KEYBOARD.ShiftKeyDown)
    {
        mods |= Keys.Shift;
    }

    return mods;
}

您可以在 KeyDown 或 PreviewKeydown 事件中執行類似操作。

在這里,我只是以Shift + A為例:

if (e.Key == Key.A && Keyboard.Modifiers == ModifierKeys.Shift)
{
    // Do something.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM