C# 如何使用复选框添加修改器键

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)

我有多个复选框。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个如果,但这将是非常混乱的,因为用户将能够检查他是否想要使用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);是的,加括号总是好的。如果不先尝试编译代码,就会错过类似的小事情。显然,我没有记住操作符的关联性规则。更新了我的答案。