3

私は現在、アクションを実行するためのホットキーの設定を扱うプロジェクトに取り組んでいます。ホットキー機能は機能していますが、キーが修飾子のみで構成されている場合は、ホットキーを設定できないようにします。たとえば、Ctrl+Fは有効なホットキーですが、Ctrl+Altはそうではありません。

実際のKeys列挙オブジェクトから修飾キーを取り除き、それをKeys.Noneと照合して、修飾キーのみで構成されているかどうかを判断する方法をいくつか試しました。ただし、実際には、これはあまりうまく機能していません。

私は最初にこの方法を試しました:

private Keys StripModifiers(Keys Key)
{
    return Key & ~Keys.Modifiers;
}

CtrlキーがLButton|のKeyDataプロパティを使用してPreviewKeypressメソッドを呼び出しているように見えるため、これは機能しませんでした。ShiftKey | Keys.Modifiersビットマスクが完全にはキャッチしていないように見えるコントロール。

私は自分自身のもっと複雑なものを書いてみました:

private Keys StripModifiers(Keys Key)
{
    return Key &
        ~Keys.Alt &
        ~Keys.CapsLock &
        ~Keys.Control &
        ~Keys.ControlKey &
        ~Keys.LControlKey &
        ~Keys.LMenu &
        ~Keys.LShiftKey &
        ~Keys.LWin &
        ~Keys.MButton &
        ~Keys.Menu &
        ~Keys.NumLock &
        ~Keys.RButton &
        ~Keys.RControlKey &
        ~Keys.RMenu &
        ~Keys.RShiftKey &
        ~Keys.RWin &
        ~Keys.Scroll &
        ~Keys.Shift &
        ~Keys.ShiftKey;
}

ただし、KeyDataプロパティが65のイベントを呼び出すだけのAキーを押すと、Keys.Noneになり、制限が厳しすぎるため、これも機能しませんでした。

私はこの時点でほとんど途方に暮れています、誰かが以前にこの問題に遭遇したか、解決したことがありますか?

4

1 に答える 1

2

元のコードは正しいです。でもう少し読みやすくすることができますがKey & Keys.KeyCode、同じ結果が得られます。したがって、[オプション]ウィンドウでこのメソッドを使用する必要があります。

private static IsValidShortcutKey(Keys key) {
    return (key & Keys.KeyCode) != Keys.None;
}

その後、ProcessKeyPreview()について話すことに少し迷っています。代わりにProcessCmdKey()を使用する必要があります。それは、ユーザーがIsValidShortcutKey()によって有効と見なされたキーを選択してからずっと後のことですはい、選択したショートカットと一致するかどうかに関係なく、どのキーでもそのメソッドが実行されます。Keys.ToString()メソッドは、[Flags]属性を持つKeys列挙によって引き起こされる、実際のキーストロークを表示するというお粗末な仕事をするため、さらに混乱が生じます。intにキャストして、実際の値を確認します。

したがって、2つの非常に異なるコードのチャンクが必要です。要求されたキーストロークが有効かどうかをチェックするオプションメニューの1つのチャンク。IsValidShortcutKey()を使用する必要があります。

そして、キーが押されたかどうかをチェックする別のチャンク。これは次のようなものに似ているはずです:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == keySelectedInConfig) {
            RunOperationSelectedInConfig();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
于 2012-05-18T01:26:45.840 に答える