等待用户KeyPress WinForms

时间:2018-07-15 01:14:28

标签: c# winforms

嗨,我的问题似乎很简单,但我不能一个人解决。

我有一个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
    }

谢谢。

3 个答案:

答案 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;