From aa6e7ad7b8fd0fa24faf08eb44e5432e66fe890f Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 6 Apr 2018 18:23:20 +0300 Subject: CLIST_INTERFACE::pfnEventsProcessTrayDoubleClick => Clist_EventsProcessTrayDoubleClick --- plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp | 192 +++++++++++++--------------- 1 file changed, 91 insertions(+), 101 deletions(-) (limited to 'plugins/HwHotKeys/src') diff --git a/plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp b/plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp index 17065834a2..0908375dc8 100644 --- a/plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp +++ b/plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp @@ -21,113 +21,103 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 - 1307, USA. LRESULT CALLBACK key_hook(int nCode, WPARAM wParam, LPARAM lParam) // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644985%28v=vs.85%29.aspx { - KBDLLHOOKSTRUCT *pKbdLLHookStruct = (KBDLLHOOKSTRUCT *)lParam; - if (nCode >= 0) - { - if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) // при отпускании любой кнопки - сбрасываем всю накопленную комбинацию - { - key_code = 0; - } - else if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) - { - if (!(pKbdLLHookStruct->scanCode & 0xFFFFFF00) && (pKbdLLHookStruct->scanCode & 0xFF)) // && !(pKbdLLHookStruct->flags & LLKHF_INJECTED)) - // 0xFFFFFF00 фильтр дл¤ странных двойных сканкодов например перед L_Alt/AltGr, - // 0xFF фильтр дл¤ нулевых сканкодов(приход¤т при вс¤кой там эмул¤ции нажатий и т.п.) - // LLKHF_INJECTED фильтр дл¤ эмулируемых нажатий, но есть проблема с некоторыми клавами - { - // строим комплексный код(сканкод + доп.флаг LLKHF_EXTENDED), от 0 до 1FF - key_code_raw = (LOBYTE(pKbdLLHookStruct->scanCode) | ((LOBYTE(pKbdLLHookStruct->flags)&1) << 8)); + KBDLLHOOKSTRUCT *pKbdLLHookStruct = (KBDLLHOOKSTRUCT *)lParam; + if (nCode >= 0) { + if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) // при отпускании любой кнопки - сбрасываем всю накопленную комбинацию + key_code = 0; - if (hDialogWnd) // если диалог настроек открыт - выводим в него нажимаемые кнопоки - { - StringCbPrintfA(key_name_buffer, sizeof(key_name_buffer), "%03X %s", key_code_raw, key_tab[(key_code_raw & 0x1FF)]); - SetDlgItemTextA(hDialogWnd, dlg_scancode_edit, key_name_buffer); - } + else if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) { + // 0xFFFFFF00 фильтр для странных двойных сканкодов например перед L_Alt/AltGr, + // 0xFF фильтр для нулевых сканкодов(приходят при всякой там эмуляции нажатий и т.п.) + // LLKHF_INJECTED фильтр для эмулируемых нажатий, но есть проблема с некоторыми клавами + if (!(pKbdLLHookStruct->scanCode & 0xFFFFFF00) && (pKbdLLHookStruct->scanCode & 0xFF)) { + // строим комплексный код(сканкод + доп.флаг LLKHF_EXTENDED), от 0 до 1FF + key_code_raw = (LOBYTE(pKbdLLHookStruct->scanCode) | ((LOBYTE(pKbdLLHookStruct->flags) & 1) << 8)); - switch (key_code_raw) // провер¤ем кнопки модификаторов - { - case 0x01D: // L_Ctrl - key_code |= key_flag_cl; - break; // после модификаторов - ничего не делаем, выход из хука. - case 0x11D: // R_Ctrl - key_code |= key_flag_cr; - break; - case 0x038: // L_Alt - key_code |= key_flag_al; - break; - case 0x138: // R_Alt - key_code |= key_flag_ar; - break; - case 0x15B: // L_Win - key_code |= key_flag_wl; - break; - case 0x15C: // R_Win - key_code |= key_flag_wr; - break; - case 0x02A: // L_Shift - key_code |= key_flag_sl; - break; - case 0x036: // R_Shift - key_code |= key_flag_sr; - break; - case 0x12A: // L_Shift_fake - key_code |= key_flag_sl; - break; - case 0x136: // R_Shift_fake - key_code |= key_flag_sr; - break; - default: // если это не кнопка модификатора - то дальнейша¤ обработка - key_code = (LOWORD(key_code_raw)) | (key_code & 0xFFFF0000); // в старшей половине там лежат биты модификаторов - их оставл¤ем (они там могут быть от предыдущего раза) - if (hDialogWnd) // если диалог настроек открыт - выводим в него комплексную комбинацию (типа Shift+Key), которую потом можно назначить; - { - if (IsDlgButtonChecked(hDialogWnd, dlg_combine)) // левые/правые модификаторы объедин¤ть в один? - { - DWORD tmp1, tmp2; - tmp1 = ((key_code >> 4) | (key_code >> 8)) & 0x00F00000; - tmp2 = LOWORD(key_code) | tmp1; - tmp2 &= 0x00F001FF; - key_code_assign = tmp2; - } - else - { - key_code_assign = key_code; - } - HwHotKeys_PrintFullKeyname(key_code_assign); - SetDlgItemTextA(hDialogWnd, dlg_keyname_edit, key_name_buffer); - } - else // хоткей выполн¤ют действи¤ только если закрыт диалог настроек (чтобы не мешал настраивать) - { - if (HwHotKeys_CompareCurrentScancode(code_Close)) // хоткей полного закрыти¤ Miranda - { - // Beep(300, 200); - CallService("CloseAction", 0, 0); - return 1; - } - else if (HwHotKeys_CompareCurrentScancode(code_HideShow)) // хоткей сворачивани¤/разворачивани¤ главного окна Miranda - { - // Beep(700, 200); - pcli->pfnShowHide(); // есть варианты - return 1; - } - else if (HwHotKeys_CompareCurrentScancode(code_ReadMsg)) // хоткей чтени¤ сообщени¤ - { - // Beep(1500, 200); - if (pcli->pfnEventsProcessTrayDoubleClick(0) != 0) // клик по трею дл¤ стандартного открыти¤ сообщени¤ - { // иначе - окно чата уже открыто и надо его вытащить наверх... - SetForegroundWindow(pcli->hwndContactList); - SetFocus(pcli->hwndContactList); - // хот¤ всЄ равно это не очень работает в новой винде - // надо http://www.rsdn.ru/article/qna/ui/wndsetfg.xml - // но пока незнаю где тут вз¤ть хэндл окна чата(причЄм именно дл¤ - // выбранного контакта, их же несколько может быть если простой srmm) - // у миранды в hkRead такие же проблемы - } - return 1; // возврат 1 запрещает дальнейшую работу кнопки, т.е. кнопка после нашего плагина никому более не достанетс¤ - } + if (hDialogWnd) { // если диалог настроек открыт - выводим в него нажимаемые кнопоки + StringCbPrintfA(key_name_buffer, sizeof(key_name_buffer), "%03X %s", key_code_raw, key_tab[(key_code_raw & 0x1FF)]); + SetDlgItemTextA(hDialogWnd, dlg_scancode_edit, key_name_buffer); + } + + switch (key_code_raw) { // проверяем кнопки модификаторов + case 0x01D: // L_Ctrl + key_code |= key_flag_cl; + break; // после модификаторов - ничего не делаем, выход из хука. + case 0x11D: // R_Ctrl + key_code |= key_flag_cr; + break; + case 0x038: // L_Alt + key_code |= key_flag_al; + break; + case 0x138: // R_Alt + key_code |= key_flag_ar; + break; + case 0x15B: // L_Win + key_code |= key_flag_wl; + break; + case 0x15C: // R_Win + key_code |= key_flag_wr; + break; + case 0x02A: // L_Shift + key_code |= key_flag_sl; + break; + case 0x036: // R_Shift + key_code |= key_flag_sr; + break; + case 0x12A: // L_Shift_fake + key_code |= key_flag_sl; + break; + case 0x136: // R_Shift_fake + key_code |= key_flag_sr; + break; + + default: // если это не кнопка модификатора - то дальнейшая обработка + key_code = (LOWORD(key_code_raw)) | (key_code & 0xFFFF0000); // в старшей половине там лежат биты модификаторов - их оставляем (они там могут быть от предыдущего раза) + if (hDialogWnd) { // если диалог настроек открыт - выводим в него комплексную комбинацию (типа Shift+Key), которую потом можно назначить; + if (IsDlgButtonChecked(hDialogWnd, dlg_combine)) { // левые/правые модификаторы объединять в один? + DWORD tmp1, tmp2; + tmp1 = ((key_code >> 4) | (key_code >> 8)) & 0x00F00000; + tmp2 = LOWORD(key_code) | tmp1; + tmp2 &= 0x00F001FF; + key_code_assign = tmp2; + } + else key_code_assign = key_code; + + HwHotKeys_PrintFullKeyname(key_code_assign); + SetDlgItemTextA(hDialogWnd, dlg_keyname_edit, key_name_buffer); + } + else { // хоткей выполняют действия только если закрыт диалог настроек (чтобы не мешал настраивать) + if (HwHotKeys_CompareCurrentScancode(code_Close)) { // хоткей полного закрытия Miranda + // Beep(300, 200); + CallService("CloseAction", 0, 0); + return 1; + } + + if (HwHotKeys_CompareCurrentScancode(code_HideShow)) { // хоткей сворачивания/разворачивания главного окна Miranda + // Beep(700, 200); + pcli->pfnShowHide(); // есть варианты + return 1; + } + + if (HwHotKeys_CompareCurrentScancode(code_ReadMsg)) { // хоткей чтения сообщения + // Beep(1500, 200); + if (Clist_EventsProcessTrayDoubleClick(0) != 0) { // клик по трею для стандартного открытия сообщения + // иначе - окно чата уже открыто и надо его вытащить наверх... + SetForegroundWindow(pcli->hwndContactList); + SetFocus(pcli->hwndContactList); + // хотя всЄ равно это не очень работает в новой винде + // надо http://www.rsdn.ru/article/qna/ui/wndsetfg.xml + // но пока незнаю где тут взять хэндл окна чата(причём именно для + // выбранного контакта, их же несколько может быть если простой srmm) + // у миранды в hkRead такие же проблемы } + return 1; // возврат 1 запрещает дальнейшую работу кнопки, т.е. кнопка после нашего плагина никому более не достанется } + } } } } + } + return CallNextHookEx(hHook, nCode, wParam, lParam); } -- cgit v1.2.3