2014-10-07 6 views
0

모든 키 입력을 표시하는 다음 코드 조각을 작성했습니다. 내가 알고 싶은 것은 내가 Ctrl 키 + , Alt 키와 같은 조합 키를 누르면 + O 또는 Ctrl 키 + 또한 또는 Ctrl 키 + Alt 키를 이러한 키를 + 을 삭제 삭제한다는 것입니다 콘솔에 표시됩니다. 접근 방식은 무엇이되어야합니까?모든 키 조합 표시

방금 ​​들었던 또 다른 한 가지는 누군가가 키를 잡고 다른 동작 키를 계속 누르면이 동작을 여기 캡처 할 수 있다는 것입니다.

[DllImport("user32.dll")] 
public static extern int GetAsyncKeyState(Int32 i); 

for (Int32 i = 0; i < 255; i++) 
{ 
    int keyState = GetAsyncKeyState(i); 
    if (keyState == 1 || keyState == -32767) 
    { 
     Console.WriteLine((Keys)i); 
     break; 
    } 
} 
+3

당신이 ['GetAsyncKeyState'에 대한 설명서 읽기]를 했습니까 (HTTP 연습으로

, 나는하여 GetAsyncKeyState API 호출을 입증하기 위해 다음 썼다 : //msdn.microsoft.com/en-us/library/windows/desktop/ms646293 (v = vs.85) .aspx)? –

+0

예 uwe 나는 그것을 읽었지 만 나 같은 괴상한 것이었다. 실제로 win32 API는 나에게 무서워 보인다. 나는 그것을 반복해서 읽고 쓰레기에 코드를 던지기로 결정했다. 그런 다음 나는 stackoverflow가 있다고 생각했다. 도와주세요. –

+2

@khan, 그러면 설명서를 이해하는 데 필요한 배경 지식과 기술을 개발해야합니다. 그렇지 않으면 실제 코드가하는 것을 이해할 기회가 없습니다. –

답변

1

나는 GetKeyboardState 기능을 찾고 있다고 생각합니다. 한 번의 통화로 모든 가상 키의 상태를 알려 드리겠습니다. GetAsyncKeyState 함수는 사용자가 키를 눌렀는지 여부를 확인하는 데 더 유용합니다. 여기

using System; 
using System.Runtime.InteropServices; 
using System.Threading; 

namespace s26244308 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      bool keepGoing = true; 

      while (keepGoing) 
      { 
       int wasItPressed = SysWin32.GetAsyncKeyState(SysWin32.VK_ESCAPE); 
       if (wasItPressed != 0) 
       { 
        keepGoing = false; // stop 
        continue; 
       } 

       // for this sample: just loop a few letters 
       for (int x = 0x41; x <= 0x4A; x++) 
       { 
        int letterPressed = SysWin32.GetAsyncKeyState(x); 
        if (letterPressed != 0) 
        { 
         // now check for a few other keys 
         int shiftAction = SysWin32.GetAsyncKeyState(SysWin32.VK_SHIFT); 
         int ctrlAction = SysWin32.GetAsyncKeyState(SysWin32.VK_CONTROL); 
         int altAction = SysWin32.GetAsyncKeyState(SysWin32.VK_MENU); 

         // format my output 
         string letter = string.Format("Letter: {0} ({1})", Convert.ToChar(x), KeyAction(letterPressed)); 
         string shift = string.Format("Shift: {0}", KeyAction(shiftAction)); 
         string ctrl = string.Format("Control: {0}", KeyAction(ctrlAction)); 
         string alt = string.Format("Alt: {0}", KeyAction(altAction)); 

         Console.WriteLine("{0,-20}{1,-18}{2,-18}{3,-18}", letter, shift, ctrl, alt); 
         break; 
        } 
       } 
       Thread.Sleep(10); 
      } 

      Console.WriteLine("-- Press Any Key to Continue --"); 
      Console.ReadLine(); 
     } 

     private static string KeyAction(int pressed) 
     { 
      if (pressed == 0) 
       return "Up"; 

      // check LSB 
      if (IsBitSet(pressed, 0)) 
       return "Pressed"; 

      // checked MSB 
      if (IsBitSet(pressed, 15)) 
       return "Down"; 

      return Convert.ToString(pressed, 2); 
     } 
     private static bool IsBitSet(int b, int pos) 
     { 
      return (b & (1 << pos)) != 0; 
     } 
    } 

    class SysWin32 
    { 
     public const int VK_ESCAPE = 0x1B; 
     public const int VK_SHIFT = 0x10; 
     public const int VK_CONTROL = 0x11; 
     public const int VK_MENU = 0x12; 

     [DllImport("user32.dll")] 
     public static extern int GetAsyncKeyState(Int32 i); 
    } 

} 

콘솔 출력 : Console Output

+0

시간이 있으면 코드를 설명하십시오. –

+0

나를 위해이 운동을 해 주셔서 감사합니다. –

+0

키보드 입력을 받아 들인 이후 getAsync에 대한 루프가 필요한 이유를 초조하게 만드는 것은 반복문의 특정 반복에서 입력 키를 올바르게 표시하는 방법입니다. –

0

나는 당신이 무엇을 요구하고 있는지 이해하고 있다고 생각합니다. 사용자가 누르는 키 조합을 확인하는 방법이 필요합니다. 나는 당신이 GetAsyncKeyState()를 사용하지 않고 찾고있는 것을 시도했다.

prevKey = currentKey; 
currentKey = e.KeyCode; 

if (prevKey == Keys.ControlKey && currentKey == Keys.Menu) 
{ 
    // Some action 
} 
else 
    // Some other action 

당신은 키 조합이 사용자 프레스를 모니터링하고 특정 조합에 행동의 상관 관계를 할 수있는 능력을 가지고 : 여기

내가 만든에서 KeyDown 이벤트 작업입니다. 위의 코드는 사용자가 해당 순서대로 CTRL + ALT를 누른 경우를 보여줍니다.

KeyDown 이벤트가 더 좋은 이유는 눌렀을 때 키 값을 캡처하기 때문입니다.