2014-10-07 3 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 : //msdn.microsoft.com/en-us/library/windows/desktop/ms646293 (v = vs.85) .aspx)? –

+0

Да, я читал это, но он был загадочным для goof, как и я. Фактически API win32 выглядит очень страшно для меня. Я планировал это снова и снова читать, а затем решил бросить мой код на мусор, но потом я подумал, что есть stackoverflow, который мог бы Помоги мне. –

+2

@khan, тогда вам нужно разработать фон и навыки, необходимые для понимания документации, иначе у вас нет шансов понять, что делает настоящий код. –

ответ

1

Я считаю, что вы ищете GetKeyboardState функции. Я дам вам статус всех виртуальных ключей за один вызов. Функция GetAsyncKeyState лучше использовать для проверки того, нажал ли пользователь ключ или нет.

В качестве упражнения, я написал следующее, чтобы продемонстрировать GetAsyncKeyState API вызова:

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, поскольку он принимает ввод с клавиатуры, я имею в виду, как он правильно отображает мой входной ключ при определенной итерации цикла for. –

0

Я думаю, что понимаю, что вы просите. Вам нужен способ проверить комбинации клавиш, которые пользователь нажимает. Я попытался найти то, что вы ищете, не используя GetAsyncKeyState().

Вот действие KeyDown событий, которые я сделал:

prevKey = currentKey; 
currentKey = e.KeyCode; 

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

У вас есть возможность контролировать комбинации клавиш, которые пользователь нажимает и соотносить действие в определенной комбинации. Вышеприведенный код показывает, должен ли пользователь нажимать CTRL + ALT в этой последовательности.

Причина, по которой событие KeyDown лучше, заключается в том, что вы фиксируете значение ключа прямо при нажатии.

Смежные вопросы