C# 如何使用复选框添加修改器键
我有多个复选框。CTRL[],ALT[],SHIFT[]。如果选中checkobx,是否可以添加修改器C# 如何使用复选框添加修改器键,c#,.net,checkbox,hotkeys,modifiers,C#,.net,Checkbox,Hotkeys,Modifiers,我有多个复选框。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)
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个如果,但这将是非常混乱的,因为用户将能够检查他是否想要使用ctrl和/或alt和/或shift和/或键,。我甚至尝试了一些数组,但不知道如何解决这个问题。如果是多个或多个问题,您可以尝试以下方法:
Dim Dipswitch as boolean() 'a single array of boolean
If DipSwitch(0) Then DoA
If DipSwitch(1) Then DoB
If DipSwitch(2) Then DoC
If DipSwitch(3) And Not DipSwitch(4) Then DoD
然后,标签可以是类似“0011”的东西。对于双列直插式开关3和4的情况
希望我能很好地理解您的问题。避免使代码变得不必要的复杂。就这样做吧:
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”语句完全相同的IL。但是,在这种情况下,它们更容易阅读
找到用位数组重写这种逻辑的复杂方法不会有任何真正的性能优势。瓶颈不是计算要传递给RegisterHotKey
函数的参数的逻辑,而是对RegisterHotKey
函数的实际调用。编译器或JIT编译器都无法对此进行优化,您正在调用位于系统DLL中的外部函数。这很慢(当然,相对而言,这在应用程序中仍然不是一个性能问题)
就我个人而言,我认为让逻辑变得更复杂需要可读性(因此也需要维护)成本。有了上面的代码,任何具有基本编程知识的人都可以知道发生了什么 你犯了什么错误?如何定义
fsModifiers
?在创建具有相同ID的新热键之前,需要先注销旧热键(至少在现代版本的Windows上。我假设您使用的是7或8)。注销旧热键不是问题。我想知道如何创建数组,或者如何在不使用7x IFs的情况下创建数组。我不知道有什么错误,我怎么可能,第二个代码只是我想要实现的一个例子。@Capa,我是否正确地理解您的问题是如何以编程方式(基于复选框的状态)创建或组合fsModifiers枚举值?谢谢您的回复,但我在c#中并没有那个建议。我会阅读这篇文章,并尝试自己解决这个问题,如果我能使用它,我会将答案标记为已解决。谢谢回复。这是一个很好的解决方案,但我仍然对代码有问题。运算符|不能应用于int和bool类型的操作数。查过了吗?fsModifiers.Ctrl:0 | chkAlt.是否选中?fsModifiers.Alt:0 | chkShift.是否选中?fsModifiers.Shift:0 | chkWin.已检查?fsModifiers.Win:0,好的,我需要添加(()):((cbox.cbTOGGLE_ON_CTRL.Checked?(uint)fsModifiers.Control:(uint)fsModifiers.None);(cbox.cbTOGGLE_ON_CTRL.Checked?(uint)fsModifiers.Control:(uint)fsModifiers.None)),(uint)Keys.S);是的,加括号总是好的。如果不先尝试编译代码,就会错过类似的小事情。显然,我没有记住操作符的关联性规则。更新了我的答案。