keydown事件取消其他c#
keydown events cancelling other out c#
再次抱歉问了一个可能很简单的问题,但我一直在互联网上搜索此解决方案,但我无法找到。我在高中编程,正在做一个期末项目。除了这一小部分,我已经完成了所有工作。我制作了 2 个后台工作人员(每个玩家一个)并且我有 keydown 事件打开这些后台工作人员。这是代码:
if (e.keycode == Keys.D)
{
p1f = true;
bgwPlayerOne.RunWorkerAsync();
}
if (e.keycode == Left)
{
p2f = true;
bgwPlayerTwo.RunWorkerAsync();
}
好的,所以我必须输入它,因为它在我的另一台没有互联网的计算机上,但这是 keydown 事件中的代码。变量告诉后台工作者执行哪个 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 Keyboard
包装程序。您将需要自己进行一些手动跟踪。
您可以有一个 HashSet<Keys>
来存储当前按下的键。您在 KeyDown
事件中添加新密钥并在 KeyUp
事件中删除它们。然后您可以遍历列表以检查当前哪些键处于关闭状态并采取相应措施。
再次抱歉问了一个可能很简单的问题,但我一直在互联网上搜索此解决方案,但我无法找到。我在高中编程,正在做一个期末项目。除了这一小部分,我已经完成了所有工作。我制作了 2 个后台工作人员(每个玩家一个)并且我有 keydown 事件打开这些后台工作人员。这是代码:
if (e.keycode == Keys.D)
{
p1f = true;
bgwPlayerOne.RunWorkerAsync();
}
if (e.keycode == Left)
{
p2f = true;
bgwPlayerTwo.RunWorkerAsync();
}
好的,所以我必须输入它,因为它在我的另一台没有互联网的计算机上,但这是 keydown 事件中的代码。变量告诉后台工作者执行哪个 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 Keyboard
包装程序。您将需要自己进行一些手动跟踪。
您可以有一个 HashSet<Keys>
来存储当前按下的键。您在 KeyDown
事件中添加新密钥并在 KeyUp
事件中删除它们。然后您可以遍历列表以检查当前哪些键处于关闭状态并采取相应措施。