检查Winforms中是否按了热键
要捕获热键检查Winforms中是否按了热键,winforms,hotkeys,Winforms,Hotkeys,要捕获热键Ctrl+A,我们可以在Form1\u KeyDown中使用以下语句 if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A) { MessageBox.Show("Test"); } 要捕获Ctrl+Alt+A,我们可以使用: if (e.Control && e.Alt) { if (e.KeyCode == Keys.A) { //
Ctrl+A
,我们可以在Form1\u KeyDown
中使用以下语句
if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
{
MessageBox.Show("Test");
}
要捕获Ctrl+Alt+A
,我们可以使用:
if (e.Control && e.Alt)
{
if (e.KeyCode == Keys.A)
{
// Your code goes here
}
}
问题是如何捕获热键,如代码> CTRL+A+B?< /P> < P>,可以将第一个键视为附加或自定义修饰符来扩展快捷方式的范围。 声明一个类变量以保存该修饰符:
私钥KeyModifier=密钥。无;
按如下方式处理KeyDown
事件:
private void formwhere\u KeyDown(对象发送方,KeyEventArgs e)
{
如果(如控制)
{
开关(如钥匙代码)
{
案例关键。B:
if(KeyModifier==Keys.A)
{
//句柄Ctrl+AB
}
其他的
{
//句柄Ctrl+B
}
打破
案例关键。C:
if(KeyModifier==Keys.A)
{
//手柄Ctrl+AC
}
其他的
{
//句柄Ctrl+C
}
打破
违约:
//否则,将按下的键设置为键修改器。
KeyModifier=e.KeyCode;
打破
}
}
}
松开控制
键时重置修改器。这对于正确执行上述操作非常重要
private void formwhere\u KeyUp(对象发送方,KeyEventArgs e)
{
如果(!e.Control)KeyModifier=Keys.None;
}
这里有一些东西可以让您开始使用
当按下Ctrl-A-B时,而不是释放时,将触发此操作。当按下这些键时,它当前也会反复触发。这可以通过混合中的另一个布尔变量进行更改。这绝对不是完美的
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private MyFilter mf = new MyFilter();
private void Form1_Load(object sender, EventArgs e)
{
mf.Ctrl_A_B += Mf_Ctrl_A_B;
Application.AddMessageFilter(mf);
}
private void Mf_Ctrl_A_B()
{
Console.WriteLine("Ctrl-A-B was held down!");
}
}
public class MyFilter : IMessageFilter
{
private bool keyCtrl;
private bool keyA;
private bool keyB;
private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
public delegate void dlg_Ctrl_A_B();
public event dlg_Ctrl_A_B Ctrl_A_B;
public bool PreFilterMessage(ref Message m)
{
Keys keyData;
switch (m.Msg)
{
case WM_KEYDOWN:
keyData = (Keys)((int)m.WParam);
switch (keyData)
{
case Keys.ControlKey:
keyCtrl = true;
break;
case Keys.A:
keyA = true;
break;
case Keys.B:
keyB = true;
break;
}
if (keyCtrl && keyA && keyB)
{
Ctrl_A_B?.Invoke();
}
break;
case WM_KEYUP:
keyData = (Keys)((int)m.WParam);
switch (keyData)
{
case Keys.ControlKey:
keyCtrl = false;
break;
case Keys.A:
keyA = false;
break;
case Keys.B:
keyB = false;
break;
}
break;
}
return false;
}
}
你的意思是
Ctrl+A,Ctrl+B
(Ctrl+A
后接B
,而Ctrl
键仍被按下,或者,Ctrl
键尚未松开)。@Jimi仍被按下在WinForms中执行此操作没有简单的方法。你必须保留一本布尔字典,并记录按下的键。或者,您可以导入WPF运行时并将Keyboard.IsKeyDown
与KeyDown
事件结合使用。您也可以求助于Win32 API并使用类似于GetKeyState
的东西,该“热键”是否只在您的应用程序中起作用?关于Ctrl+J+E
或任何其他组合呢?我们应该为每个变量声明一个变量吗?要么就是这样,要么创建某种字典
,以便您可以查找和切换特定的值。不管怎样都会变得一团糟……嗯,如果你允许的话,我不这么认为。只要一个变量就足够了。类似于另一个答案。适用于任意Ctrl+any+any
。不管投票结果如何,试试看。感谢您抽出时间。@dr.null使用字典
的方法将是最灵活的。如果明天他们要求Ctrl-A-B-C,甚至你的方法也需要修改。