Проверка на нажатие клавиши - 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();
 
            }
        }
 
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы