2017-11-28 4 views
2

의심되는 질문을하기 위해 다시 한 번 미안하지만 인터넷에서이 솔루션을 검색하고 있지만 그럴 수는 없습니다. 저는 Highschool 프로그래밍에서 최종 프로젝트 작업을하고 있습니다. 나는이 작은 부분을 제외하고는 모든 것을 끝냈다. 나는 2 명의 배경 작업자를 만들었고 (각 플레이어마다 하나씩) 나는이 배경 작업자를 키잉하는 이벤트를 가지고있다. 여기에 코드입니다 :keydown 이벤트가 다른 것을 취소 함 C#

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(); 
     } 
    } 
+2

우리가 어떻게 키 누르기를 처리하고 winform, WPF 또는 콘솔 – Steve

+0

Keydown 및 KeyUp 이벤트를 사용했는지 표시하려면 Key Press 이벤트가 더 잘 작동합니까? – user8980526

+0

이 작업을 수행하기 위해이 작업을위한 키를 눌러야합니다. – user8980526

답변

0

이 코드 문제 몇 가지가 있습니다 내가 그들을 통해 하나 하나를 이동합니다.

첫 번째로 KeyDown 이벤트는 아무 키나 누르고 있으면 초당 여러 번 실행됩니다.

즉, 두 번째로 이벤트가 발생하기 전에 RunWorkerAsync();이 완료되지 않은 경우 InvalidOperationException이 수신됨을 의미합니다.

이전에 키를 누른 상태에서 A 키를 누른 상태에서 D 키를 계속 누르고 있으면 두 키가 동시에 눌러져 있어도 새 키 코드가 A가 아닌 D가됩니다. 메모장에서이 동작을 테스트 할 수 있습니다.

WinForm을 사용하고 있으므로 Win32 Keyboard 래퍼에 액세스 할 수 없습니다. 수동 추적을해야합니다.

HashSet<Keys>은 현재 누르고있는 키를 저장할 수 있습니다. KeyDown 이벤트에 새 키를 추가하고 KeyUp 이벤트에서 제거합니다. 그런 다음 목록을 반복하여 현재 어떤 키가 작동 중인지 확인하고 적절히 조치 할 수 있습니다.

+0

좋아, 오늘 밤 이걸 살펴볼거야, 고마워! – user8980526

관련 문제