键控事件取消其他输出c#

键控事件取消其他输出c#,c#,multithreading,keydown,C#,Multithreading,Keydown,很抱歉再次提出一个可能很简单的问题,但我一直在互联网上搜索此解决方案,但我无法。我在高中编程,正在做最后一个项目。除了这一小部分,我什么都做了。我有两个背景工人(每个球员一个)和我有按键事件打开这些背景工人。代码如下: if (e.keycode == Keys.D) { p1f = true; bgwPlayerOne.RunWorkerAsync(); } if (e.keycode == Left) { p2f = true; bgwPlayerTwo.Ru

很抱歉再次提出一个可能很简单的问题,但我一直在互联网上搜索此解决方案,但我无法。我在高中编程,正在做最后一个项目。除了这一小部分,我什么都做了。我有两个背景工人(每个球员一个)和我有按键事件打开这些背景工人。代码如下:

if (e.keycode == Keys.D)
{
    p1f = true;
    bgwPlayerOne.RunWorkerAsync();
}
if (e.keycode == Left)
{
    p2f = true;
    bgwPlayerTwo.RunWorkerAsync();
}
好的,我必须把它打出来,因为它在我的另一台没有互联网的计算机上,但这是按键事件中的代码。这些变量告诉后台工作者哪些if语句要执行。但是,主要的问题是,每当我同时按D键和左箭头键时,在另一次单击之前进行的一次单击将停止,并且最新的按键事件将开始。我以前使用计时器时没有这个问题(我有一个滞后问题,所以我切换到多线程)。如果有任何问题,请告诉我,任何帮助将不胜感激,谢谢

更新*****

private void frmTankBattle_MapOne_KeyDown(object sender, KeyEventArgs e)
    {


            if (e.KeyCode == Keys.D)
            {
                p1f = true;
                bgwPlayerOne.RunWorkerAsync();

            }
            //System.Threading.Thread.Sleep(1);
            if (e.KeyCode == Keys.A)
            {
                p1b = true;
                bgwPlayerOne.RunWorkerAsync();
            }
            //System.Threading.Thread.Sleep(1);
            if (e.KeyCode == Keys.Left)
            {
                p2f = true;
                bgwPlayerTwo.RunWorkerAsync();
            }
            //System.Threading.Thread.Sleep(1);
            if (e.KeyCode == Keys.Right)
            {
                p2b = true;
                bgwPlayerTwo.RunWorkerAsync();
            }

            if (e.KeyCode == Keys.Space)
            {
                p1c = true;
                tmrPlayerOneCombat.Start();
            }


       // System.Threading.Thread.Sleep(1);
    }
private void frmTankBattle_MapOne_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.D)
        {
            p1f = false;
            p1b = false;
            bgwPlayerOne.CancelAsync();
        }
        if (e.KeyCode == Keys.A)
        {
            p1f = false;
            p1b = false;
            bgwPlayerOne.CancelAsync();
        }
        if (e.KeyCode == Keys.Left)
        {
            p2f = false;
            p2b = false;
            bgwPlayerTwo.CancelAsync();
        }
        if (e.KeyCode == Keys.Right)
        {
            p2f = false;
            p2b = false;
            bgwPlayerTwo.CancelAsync();
        }
    }

你的代码有几处错误,我会逐一检查

首先,只要按住任何键,KeyDown事件将每秒触发多次

这意味着如果
RunWorkerAsync()未在事件第二次触发前完成。您将收到一个
InvalidOperationException

如果您之前按下了一个键,比如a键,然后您尝试按下D键,则新的键代码将是D而不是a,即使同时按下了两个键。您可以在记事本中测试此行为

由于您使用的是WinForm,因此无法访问Win32
键盘
包装器。您需要自己进行一些手动跟踪


您可以使用
HashSet
来存储当前按下的键。在
KeyDown
事件中添加新键,并在
keydup
事件中删除它们。然后,您可以遍历列表,检查哪些键当前处于关闭状态,并相应地执行操作

向我们展示您如何处理按键,并指出其winform、WPF或consoleI是否一直在使用Keydown和KeyUp事件,按键事件是否会在@Steve中工作得更好?我需要能够按住按键才能使此操作正常@Steve只需向我们展示确切的事件绑定,并让我们知道您使用的技术即可,我今晚到家后会这么做