winforms 如何在按住键时执行操作?

xriantvc  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(101)

我在做一个自动点击器,我有一个问题:我希望程序在按住C键的同时执行Click()方法。
我试过这个。一旦我按下一个键,我的代码就陷入了无限循环。我在StackOverflow上看到过类似的问题,但它对我不起作用。下面是我的代码:

private static bool IsHolded = false;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    Keys key = e.KeyData;
    if (key == Keys.C)
    {
        IsHolded = true;
        while (IsHolded)
        {
            Click();
        }
    }
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    IsHolded = false;
}
6yt4nkrj

6yt4nkrj1#

根据您的概念,您可以用不同的方式实现它。您可以在另一个线程中运行内部代码,并通过CancellationToken处理KeyUp事件。下面是一个实现:

CancellationTokenSource cts = new CancellationTokenSource();
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        Keys key = e.KeyData;
        if (key == Keys.C)
        {
            IsHolded = true;
            ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomeWork), cts.Token);
        }
    }
    private void DoSomeWork(object obj)
    {
        CancellationToken token = (CancellationToken)obj;

        while (!token.IsCancellationRequested)
        {
            //Do Some Work
        }
    }
    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        cts.Cancel();
        IsHolded = false;
    }

没有必要初始化IsHolded变量,除非您希望在按住'c'键时使用它来防止多次执行。为此,您应该检查KeyPress方法中IF语句内的IsHolded值:
如果(键== Keys.C &&!IsHolded)
请记住,如果您取消CancellationTokenSource,它将保持取消状态,并且在您下次按下'c'键时不会工作。因此,如果您希望处理它,您应该在KeyUp方法中Dispose并重新初始化旧的'ctx'。以下是两篇关于CancelationToken的文章。
Cancellation in Managed ThreadsRegister callbacks for cancellation requests的函数

相关问题