嗨,我的问题似乎很简单,但我不能一个人解决。
我有一个WinForms应用程序,它有一个按钮。当我按下它时,一些代码会运行,并且我想在其中有一个循环,该循环在每次按下任何键时都会中断。
我当然不能使用Console.ReadKey(),因为它是winforms,我不想用鼠标单击按钮,也不想使用另一个EventArg。
在循环中,有什么方法可以检测Winforms应用程序中的击键。
这是主意:
private void btn_Click(object sender, EventArgs e)
{
// Do stuff
while (Key is not pressed)
{
try to detect key pressing
}
// Other stuff
}
谢谢。
答案 0 :(得分:0)
有很多方法可以实现您想要的。
一种简单的方法是将Form的KeyPreview设置为true并在表单级别处理keypress事件。请注意,您需要允许循环中断(Thread.Sleep()或Task.Delay())。
有关Windows消息的高级连接信息,请选中此question
答案 1 :(得分:0)
一种解决方法是在按钮被点击后为KeyDown
添加一个事件处理程序,让它等待按键输入,然后触发第二个动作并删除该事件处理程序。
它看起来像这样:
private void btn_Click(object sender, EventArgs e)
{
// Do stuff
KeyEventHandler handler = null;
handler = delegate (object s, KeyEventArgs ev)
{
if (ev.KeyCode == Keys.A)
{
btn.KeyDown -= handler;
// Do other stuff
}
};
btn.KeyDown += handler;
}
当然,您需要将Keys.A
替换为要“监听”的实际密钥。
答案 2 :(得分:0)
如果您想在表单聚焦时检测按键,则可以使用此问题的答案https://stackoverflow.com/a/18291854/10015658
所以您的代码想要:
创建新的类“ KeyHandler” :
public class KeyHandler
{
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
private int key;
private IntPtr hWnd;
private int id;
public KeyHandler(Keys key, Form form)
{
this.key = (int)key;
this.hWnd = form.Handle;
id = this.GetHashCode();
}
public override int GetHashCode()
{
return key ^ hWnd.ToInt32();
}
public bool Register()
{
return RegisterHotKey(hWnd, id, 0, key);
}
public bool Unregiser()
{
return UnregisterHotKey(hWnd, id);
}
}
您的主要From类:(假设您的表单类名称为Form1)
private KeyHandler ghk;
bool isButtonClicked = false;
public Form1()
{
InitializeComponent();
// Keys.A is the key you want to subscribe
ghk = new KeyHandler(Keys.A, this);
ghk.Register();
}
private void HandleHotkey()
{
// Key 'A' pressed
if(isButtonClicked)
{
// Put the boolean to false to avoid spamming the function with multiple press
isButtonClicked = false;
// Other Stuff
}
}
private void btn_Click(object sender, EventArgs e)
{
// Do stuff
isButtonClicked = true;
}
protected override void WndProc(ref Message m)
{
//0x0312 is the windows message id for hotkey
if (m.Msg == 0x0312)
HandleHotkey();
base.WndProc(ref m);
}
不要忘记使用:
using System.Windows.Forms;
using System.Runtime.InteropServices;