コードを不必要に複雑にしないでください。次のようにしてください:
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 しています。これは遅いです (もちろん比較的言えば、アプリケーションのパフォーマンスの問題ではありません)。
そして個人的には、ロジックをより複雑にすると、可読性 (したがってメンテナンス) のコストがかかると思います。上記のコードを使用すると、基本的なプログラミングの知識があれば、誰でも何が起こっているかを理解できます。