避免使代码变得不必要的复杂。这样做:
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 编译器都无法对此进行优化,您正在 P/Invoking 位于系统 DLL 中的外部函数。这很慢(当然,相对而言;它仍然不是应用程序中的性能问题)。
就个人而言,我认为使逻辑更加复杂会产生可读性(因此也是维护)成本。使用上面的代码,任何具有基本编程知识的人都可以弄清楚发生了什么。