Проверка на нажатие клавиши - C#
Формулировка задачи:
Как проверить нажата ли клавиша в чужой программе? Знаю, что нужно использовать WinApi функции, но какие? Никак не могу найти
Решение задачи: «Проверка на нажатие клавиши»
textual
Листинг программы
static class Hook
{
[DllImport("user32.dll")]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevel_KeyboardProc Ipfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
private static IntPtr _hookId = IntPtr.Zero;
private delegate IntPtr LowLevel_KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
private static LowLevel_KeyboardProc _proc = HookCallback;
private const int WH_KEYBOARD_LL = 13;
private const int WH_KEYDOWN = 0x0100;
[DllImport("Kernel32.dll")]
private static extern IntPtr GetModuleHandle(string lpModuleName);
private static IntPtr SetHook(LowLevel_KeyboardProc proc)
{
Process pr = Process.GetCurrentProcess();
ProcessModule prM = pr.MainModule;
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(prM.ModuleName), 0);
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WH_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
InputLanguage inlen = InputLanguage.CurrentInputLanguage;
if (inlen.LayoutName == "Русская")
{
lb.Items.Add(GetRuSymbol(vkCode));
}
else
{
lb.Items.Add((Keys)vkCode);
}
}
return CallNextHookEx(_hookId, nCode, wParam, lParam);
}
public static void StartHook()
{
_hookId = SetHook(_proc);
}
public static void StopHook()
{
UnhookWindowsHookEx(_hookId);
}
public static ListBox lb;
private static string GetRuSymbol(int code)
{
switch (code)
{
case 81: return "Й";
case 87: return "Ц";
case 69: return "У";
case 82: return "К";
case 84: return "Е";
case 89: return "Н";
case 85: return "Г";
case 73: return "Ш";
case 79: return "Щ";
case 80: return "З";
case 219: return "Х";
case 221: return "Ъ";
case 65: return "Ф";
case 83: return "Ы";
case 68: return "В";
case 70: return "А";
case 71: return "П";
case 72: return "Р";
case 74: return "О";
case 75: return "Л";
case 76: return "Д";
case 186: return "Ж";
case 222: return "Э";
case 90: return "Я";
case 88: return "Ч";
case 67: return "С";
case 86: return "М";
case 66: return "И";
case 78: return "Т";
case 77: return "Ь";
case 188: return "Б";
case 190: return "Ю";
case 192: return "Ё";
default: Keys inp = (Keys)(code); return inp.ToString();
}
}
}