0

複数のチェックボックスがあります。CTRL[]、ALT[]、SHIFT[]。checkobx がチェックされている場合、修飾子を追加することは可能ですか?

RegisterHotKey(_hWnd, 2, (uint)fsModifiers.None, (uint)LSettings.Key_ON);

私が達成したいことの例: チェックボックス CTRL[X] と ALT[X] がチェックされている場合:

RegisterHotKey(_hWnd, 2, (uint)fsModifiers.Control | (uint)fsModifiers.Alt, (uint)Keys.S);

私は 7 つの IF を使用できることを知っていますが、ユーザーが ctrl や alt や shift や key を使用するかどうかを確認できるため、これは非常に面倒です。いくつかの配列を試してみましたが、これを解決する方法がわかりません。

4

2 に答える 2

1

コードを不必要に複雑にしないでください。次のようにしてください:

RegisterHotKey(_hWnd,
               2,
               (chkCtrl.Checked     ? fsModifiers.Ctrl  : 0)
                | (chkAlt.Checked   ? fsModifiers.Alt   : 0)
                | (chkShift.Checked ? fsModifiers.Shift : 0)
                | (chkWin.Checked   ? fsModifiers.Win   : 0),
               (uint)Keys.S);

などはchkCtrl、チェックボックス コントロールの名前です。

fsModifiers各値を uint にキャストする理由がわかりません。これらのキャストをコードから削除しました。uint 値を確実に渡したい場合は、そのように列挙を宣言するだけです。

enum fsModifiers : uint
{
   Alt      = 0x0001,
   Ctrl     = 0x0002,
   Shift    = 0x0004,
   Win      = 0x0008,
   NoRepeat = 0x4000,
};

はい、この方法で効果的に 4 つの "IF" ステートメントを使用できます。条件演算子は、「IF」ステートメントを記述した場合とまったく同じ IL にコンパイルされる可能性があります。しかし、この場合、読みやすくなっています。

このロジックをビット配列で書き換える複雑な方法を見つけても、実際のパフォーマンス上の利点はありません。ボトルネックは、関数に渡すパラメーターを計算するロジックではなく、RegisterHotKey関数の実際の呼び出しRegisterHotKeyです。コンパイラまたは JIT コンパイラがこれを最適化する方法はありません。システム DLL にある外部関数を P/Invoking しています。これは遅いです (もちろん比較的言えば、アプリケーションのパフォーマンスの問題ではありません)。

そして個人的には、ロジックをより複雑にすると、可読性 (したがってメンテナンス) のコストがかかると思います。上記のコードを使用すると、基本的なプログラミングの知識があれば、誰でも何が起こっているかを理解できます。

于 2014-05-18T12:38:36.717 に答える