Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2010, 02:01   #1
Disa49
Новичок
Джуниор
 
Регистрация: 01.05.2010
Сообщений: 2
По умолчанию Хук клавиатуры ( C# )

Задание: Реализовать класс Хук клавиатуры корректно обрабатывающий нажатие русских клавиш. На форме нахотся две кнопки начать и остановить хук и многострочный текстбокс где фиксируется какая клавиша нажата.
Программа сама сделана только препаду не понравилась реализация обработка нажатия русских клавиш с помощью switch и case. Как по-другому можно это сделать?
Код:
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();
 
            }
        }
 
    }
}
Если вопрос не ясен или нужен исходник чтоб понять как программа работает только скажите.
Disa49 вне форума Ответить с цитированием
Старый 02.05.2010, 01:36   #2
Disa49
Новичок
Джуниор
 
Регистрация: 01.05.2010
Сообщений: 2
По умолчанию

Что никто не знает как это можно сделать?
Disa49 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук на GetMessage HollyPaladin Win Api 19 16.01.2010 01:09
принадлежит ли число, введённое с клавиатуры отрезку (а;в). Границы отрезка вводятся с клавиатуры Maria, Russia Помощь студентам 3 17.02.2009 22:01
Хук на клавиатуру xshStasX Помощь студентам 1 09.08.2008 16:56
локальный хук vitalik007 Win Api 3 16.05.2008 09:08
хук rpy3uH Win Api 0 30.10.2006 20:47