[英]keydown events cancelling other out c#
再次很抱歉提出一個可能的簡單問題,但是我一直在互聯網上搜索該解決方案,但無法這樣做。 我在高中編程中從事最后的項目。 除了這小部分,我已完成所有工作。 我有2個后台工作人員(每個玩家一個),並且有按鍵事件將這些后台工作人員打開。 這是代碼:
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
事件中刪除它們。 然后,您可以遍歷列表以檢查當前哪些鍵處於按下狀態並采取相應措施。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.