簡體   English   中英

按鍵事件取消其他C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM