2016-07-20 15 views
1

現在、KeyModifierKeyの列挙型をフラグとして受け取るホットキーパッケージを使用しています。一例として、C#で列挙型の一覧に変換する

、これはCtrl+Shift+4ホットキー登録します:フラグとして列挙して渡すとき、それは実際にはビット単位のor操作(したがって、構文)を行っています、私の理解から、

hotKey = new GlobalHotKey.HotKey(Key.D4, ModifierKeys.Shift | ModifierKeys.Control);

は、 。

私のUIでは、List<Key>にキーを保存する必要があります。しかし、最終的には、押されたキーを新しいホットキーとして設定する必要があります。List<Key>を普通の古いKey(フラグ操作あり)に変換する必要があります。

ビット単位でorの操作であると思ったので、私はこの解決策をLINQで試行しました。 hotkeysPressedは私List<Key>ある

hotkeysPressedBitwise = hotkeysPressed.Select(f => f).Aggregate((x, y) => x | y);

。私のLINQ文は正しく動作しますが、実際に関数に渡すときに、私には望みの効果を与えません。

たとえば、XCを渡すと、私のLINQ文はX | Cに等しい値を返します。それをKey列挙型にキャストすると、何らかの理由でF22というキーが返されます。

hotKey = new GlobalHotKey.HotKey(keys , ModifierKeys.None);は機能しません。 (私はModifierKeysをnoneに設定しました。

ここに何か不足していますか?

答えて

3

System.Windows.Forms.Keys enumを指していると仮定します。

を組み合わせたビット単位 操作のために、この列挙型の値を使用しないでください:あなたは Keys enumについては、MSDNのドキュメントをチェックすると

は、次の警告が表示されます。列挙の値は相互に排他的ではありません。

私の知る限り、他の値と組み合わせることができるキーの列挙型の値のみであるシフトCtrlキーAltキー

列挙からの抽出物を参照:

[Flags] 
[TypeConverter(typeof(KeysConverter))] 
public enum Keys 
{ 
    ... 
    A = 65, 
    B = 66, 
    C = 67, 
    ... 
    Shift = 65536, 
    Control = 131072, 
    Alt = 262144 
} 
+0

Drats!私は何かが欠けていなければならないことを知っていました。 –

1

ホットキーは、通常、修飾子とは対照的に、組み合わせて(例えば、文字X、およびCのような)複数正規キーを可能にするように設計されていませんキー(制御、シフト、altなど)を組み合わせることができます。このため

、通常のキーにビットごとの演算を使用しているとき、彼らは連続した値が割り当てられますよう修飾キーが権力-の-2

である値を持つことになり、一方、 Key列挙型は通常、予測可能な方法で動作しません。
関連する問題