2015-01-06 2 views
2

나는 이것에 대한 검색을 시도했지만이 답변을 찾을 수 없습니다 (단지 내 나쁜 검색 기술이 아니길 바랄뿐입니다).다른 키의 콘솔에서 keypress 이벤트를 얻는 방법

static void Main(string[] args) 
    { 

     while (xa == true) 
     { 

       switch (switchNum) 
       { 
        case 0: 
         Console.WriteLine("Text"); 
         break; 
        case 1: 
         Console.WriteLine("Stuff"); 
         break; 
        case 2: 
         Console.WriteLine("More Stuff"); 
         break; 
       }  

     } 

그리고 내가 알고 싶은 것은 내가 키를 누를 때 switchNum을 변경하는 방법입니다 :하지만 제가 현재 가지고하는 것은 이것이다. 바라건대 각각의 경우에 3 가지 다른 키가 있습니다.

편집 :

Text 
Text 
Text 
Text 
Text 
Text 

을 그리고 난 내가 키 예를 누를 때 다른 것으로 변경할 : 그래서 현재 명확한 설명

는 다음과 같이 콘솔 밖으로 입력합니다

Text 
Text 
Text 
Text 
//Press w here 
Stuff 
Stuff 
Stuff 
Stuff 
//Pressing another key e.g. q 
More Stuff 
More Stuff 
More Stuff 
... 

그래서 내가 모르는 것은 다른 키를 수신하고,가는 루프를 유지하는 방법이다 "W"(따라서 readkey()이 작동하지 않을 수 있습니다). 사전에

감사합니다!

+1

대신에 읽기 전용 키를 사용할 수 있습니까 ?? – User2012384

+0

각 케이스마다 세 가지 다른 키보드 키를 의미합니까? –

+1

질문을 이해하는 데 문제가 있습니다. 이게 너 니 뒤에 오는거야? http://msdn.microsoft.com/en-us/library/471w8d85(v=vs.110).aspx –

답변

3

Console.ReadKey()를 사용하여 키가 눌려 졌는지 확인해야하며 해당 기능이 차단 기능이므로 Console.KeyAvailable을 사용하여 사용자가 무언가를 누를 때만 호출 할 수 있습니다. herehere을 더 읽을 수 있습니다.

//console input is read as a char, can be used in place of or converted to old switchNum you used 
char input = 'a';//define default so the switch case can use it 

while (xa == true) 
{ 
    //If key is pressed read what it is. 
    //Use a while loop to clear extra key presses that may have queued up and only keep the last read 
    while (Console.KeyAvailable) input = Console.ReadKey(true).KeyChar; 

    //the key read has been converted to a char matching that key 
    switch (input) 
    { 
     case 'a': 
      Console.WriteLine("Text"); 
      break; 
     case 's': 
      Console.WriteLine("Stuff"); 
      break; 
     case 'd': 
      Console.WriteLine("More Stuff"); 
      break; 
    } 
} 

:

코드는 변경 될 수 있습니다.

편집 : 제인이 언급했듯이 사용중인 루프에는 리미터가 없으며 실행중인 CPU만큼 빠르게 순환합니다. 당신은 확실히 각주기 사이에 휴식을 취하거나 변환하여 인쇄하기 전에 키를 기다리는 루프에 System.Threading.Thread.Sleep()을 포함해야 while (Console.KeyAvailable) key = Console.ReadKey(true).KeyChar에 그냥 내가 모든 짧은 후 타이밍 아웃 ReadKey()을 기반으로 솔루션을 일하고 key = Console.ReadKey(true).KeyChar

+1

방금 ​​답변을 게시하려했으나 응답 할 내용을 다룹니다.샘플에 추가 할 수있는 유일한 방법은'switch' 문 다음에 작은 대기 시퀀스가 ​​있기 때문에 가난한 콘솔 텍스트가 분당 백만 마일을 실행하지 않습니다 :) –

+0

실제로 'System.Threading.Thread.Sleep (50) '을 사용하여 루프를 최대 20 루프/초로 감속 시키거나 기다리는 시간 (ms)을 50으로 변경하십시오. – Skean

+0

고마워!,이 작동하지만, 단지 당신이 '키'를 썼을 때 입력을 의미했는지 확인하십시오. –

1

-intervals Refer with Console.Write ("\ b"); 입력 된 키에서 백 스페이스 키를 누릅니다.

@Skean의 해결 방법은 훌륭합니다. 그의 대답을 바탕으로 구축하십시오 : -

static void Main(string[] args) 
    { 
     Console.WriteLine("start"); 
     bool xa = true; 
     int switchNum = 48; // ASCII for '0' Key 
     int switchNumBkup = switchNum; // to restore switchNum on ivalid key 
     while (xa == true) 
     {  
      if (Console.KeyAvailable) 
      { 
       ConsoleKeyInfo key = Console.ReadKey(true); 
       switchNumBkup = switchNum; // to restore switchNum on ivalid key 
       switchNum = key.KeyChar; // Get the ASCII of keyPressed 
       if (key.Key == ConsoleKey.Escape) 
       { 
        Console.WriteLine("Esc Key was pressed. Exiting now...."); 
        Console.ReadKey(); // TO Pause before exiting 
        break; 
       } 
      } 
      switch (switchNum) 
      { 

        case 48: //ASCII for 0 
         Console.WriteLine("Text"); 
         break; 
        case 49: //ASCII for 1 
         Console.WriteLine("Stuff"); 
         break; 
        case 50: //ASCII for 2 
         Console.WriteLine("More Stuff"); 
         break; 
        default : 
         Console.WriteLine("Invalid Key. Press Esc to exit."); 
         switchNum = switchNumBkup; 
         break; 
      }     
      System.Threading.Thread.Sleep(200) ;     
     } 
     Console.WriteLine("Exiting "); 
    } 
+0

int를 사용하여 Skean처럼 char을 사용하는 대신 ASCII로 변환하면 어떤 이점이 있습니까? 아니면 내 질문에 int를 사용했기 때문입니까? 감사하지만, 유효한 키를 재설정하여 개선 된 답변을 얻으십시오. –

+0

@Skean 귀하의 솔루션은 훌륭합니다. 사용자가 'f'키를 입력하면 'a', 's'또는 'd'가 입력 될 때까지 콘솔에서 텍스트를 보내는 것을 멈 춥니 다. – neoLok

+0

@ Rerxx 당신이 언급했기 때문에 int를 사용했습니다. – neoLok

관련 문제