From bc1ff98d45f87cd70825e7adfd5f106b6b3fb116 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Mon, 30 Mar 2015 19:25:51 +0000 Subject: HwHotKeys plugin added, does not compile in MSVC 2010 yet (error C2470) git-svn-id: http://svn.miranda-ng.org/main/trunk@12557 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/HwHotKeys/src/HwHotKeys.cpp | 23 +++ plugins/HwHotKeys/src/HwHotKeys.h | 87 ++++++++++ plugins/HwHotKeys/src/HwHotKeys_Dlg.cpp | 108 +++++++++++++ plugins/HwHotKeys/src/HwHotKeys_DllMain.cpp | 150 +++++++++++++++++ plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp | 133 +++++++++++++++ plugins/HwHotKeys/src/HwHotKeys_KeyName.cpp | 243 ++++++++++++++++++++++++++++ plugins/HwHotKeys/src/HwHotKeys_Util.cpp | 139 ++++++++++++++++ plugins/HwHotKeys/src/HwHotKeys_resource.h | Bin 0 -> 1340 bytes plugins/HwHotKeys/src/HwHotKeys_version.h | 41 +++++ plugins/HwHotKeys/src/stdafx.cpp | 18 +++ 10 files changed, 942 insertions(+) create mode 100644 plugins/HwHotKeys/src/HwHotKeys.cpp create mode 100644 plugins/HwHotKeys/src/HwHotKeys.h create mode 100644 plugins/HwHotKeys/src/HwHotKeys_Dlg.cpp create mode 100644 plugins/HwHotKeys/src/HwHotKeys_DllMain.cpp create mode 100644 plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp create mode 100644 plugins/HwHotKeys/src/HwHotKeys_KeyName.cpp create mode 100644 plugins/HwHotKeys/src/HwHotKeys_Util.cpp create mode 100644 plugins/HwHotKeys/src/HwHotKeys_resource.h create mode 100644 plugins/HwHotKeys/src/HwHotKeys_version.h create mode 100644 plugins/HwHotKeys/src/stdafx.cpp (limited to 'plugins/HwHotKeys/src') diff --git a/plugins/HwHotKeys/src/HwHotKeys.cpp b/plugins/HwHotKeys/src/HwHotKeys.cpp new file mode 100644 index 0000000000..a922fd80ba --- /dev/null +++ b/plugins/HwHotKeys/src/HwHotKeys.cpp @@ -0,0 +1,23 @@ +// HwHotKeys.cpp: определяет экспортированные функции для приложения DLL. +// + +#include "stdafx.h" +#include "HwHotKey.h" + + + +// Пример экспортированной переменной +HWHOTKEYS_API int nHwHotKeys=0; + +// Пример экспортированной функции. +HWHOTKEYS_API int fnHwHotKeys(void) +{ + return 42; +} + +// Конструктор для экспортированного класса. +// см. определение класса в HwHotKeys.h +CHwHotKeys::CHwHotKeys() +{ + return; +} diff --git a/plugins/HwHotKeys/src/HwHotKeys.h b/plugins/HwHotKeys/src/HwHotKeys.h new file mode 100644 index 0000000000..82b3a7bb61 --- /dev/null +++ b/plugins/HwHotKeys/src/HwHotKeys.h @@ -0,0 +1,87 @@ +/* ============================================================================ +Hardware HotKeys plugin for Miranda NG. +Copyright © Eugene f2065, http://f2065.narod.ru, f2065 mail.ru, ICQ 35078112 + +This program is free software; you can redistribute it and / or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 - 1307, USA. +============================================================================ */ + +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include "HwHotKeys_resource.h" +#include "HwHotKeys_version.h" + +int initializeOptions(WPARAM, LPARAM); +INT_PTR CALLBACK OptDlgProc(HWND, UINT, WPARAM, LPARAM); +VOID HwHotKeys_PrintFullKeyname(DWORD); +BOOL HwHotKeys_CompareCurrentScancode(DWORD); +LRESULT CALLBACK key_hook(INT, WPARAM, LPARAM); +extern CLIST_INTERFACE *pcli; + + +extern HINSTANCE hInstance; +extern INT hLangpack; +extern HWND hDialogWnd; // глобально используется для вывода туда в реалтайме сканкодов клавы, из хука +extern HHOOK hHook; + +extern DWORD code_Close_tmp; +extern DWORD code_HideShow_tmp; +extern DWORD code_ReadMsg_tmp; +extern DWORD code_Close; +extern DWORD code_HideShow; +extern DWORD code_ReadMsg; + +extern DWORD key_code; +extern DWORD key_code_raw; +extern DWORD key_code_assign; + + +extern CHAR key_name_buffer[150]; +extern const CHAR *key_tab[0x200]; + +extern const CHAR *t_CL; +extern const CHAR *t_CR; +extern const CHAR *t_CC; +extern const CHAR *t_AL; +extern const CHAR *t_AR; +extern const CHAR *t_AA; +extern const CHAR *t_WL; +extern const CHAR *t_WR; +extern const CHAR *t_WW; +extern const CHAR *t_SL; +extern const CHAR *t_SR; +extern const CHAR *t_SS; + +// значения связаны с битами в HwHotKeys_CompareCurrentScancode +enum : DWORD { key_flag_sr = 0x01000000 }; +enum : DWORD { key_flag_cr = 0x02000000 }; +enum : DWORD { key_flag_ar = 0x04000000 }; +enum : DWORD { key_flag_wr = 0x08000000 }; +enum : DWORD { key_flag_sl = 0x10000000 }; +enum : DWORD { key_flag_cl = 0x20000000 }; +enum : DWORD { key_flag_al = 0x40000000 }; +enum : DWORD { key_flag_wl = 0x80000000 }; +enum : DWORD { key_flag_ss = 0x00100000 }; +enum : DWORD { key_flag_cc = 0x00200000 }; +enum : DWORD { key_flag_aa = 0x00400000 }; +enum : DWORD { key_flag_ww = 0x00800000 }; diff --git a/plugins/HwHotKeys/src/HwHotKeys_Dlg.cpp b/plugins/HwHotKeys/src/HwHotKeys_Dlg.cpp new file mode 100644 index 0000000000..c159acc2d8 --- /dev/null +++ b/plugins/HwHotKeys/src/HwHotKeys_Dlg.cpp @@ -0,0 +1,108 @@ +/* ============================================================================ +Hardware HotKeys plugin for Miranda NG. +Copyright © Eugene f2065, http://f2065.narod.ru, f2065 mail.ru, ICQ 35078112 + +This program is free software; you can redistribute it and / or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 - 1307, USA. +============================================================================ */ + +#include "HwHotKeys.h" + +INT_PTR CALLBACK OptDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + + hDialogWnd = hDlg; + + TranslateDialogDefault(hDlg); + + code_Close_tmp = code_Close; + HwHotKeys_PrintFullKeyname(code_Close_tmp); + SetDlgItemTextA(hDlg, dlg_close_edit, key_name_buffer); + code_HideShow_tmp = code_HideShow; + HwHotKeys_PrintFullKeyname(code_HideShow_tmp); + SetDlgItemTextA(hDlg, dlg_hide_edit, key_name_buffer); + code_ReadMsg_tmp = code_ReadMsg; + HwHotKeys_PrintFullKeyname(code_ReadMsg_tmp); + SetDlgItemTextA(hDlg, dlg_read_edit, key_name_buffer); + + break; //case WM_INITDIALOG + + case WM_COMMAND: + switch (wParam) + { + case dlg_close_set: + code_Close_tmp = key_code_assign; + HwHotKeys_PrintFullKeyname(key_code_assign); + SetDlgItemTextA(hDialogWnd, dlg_close_edit, key_name_buffer); + SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); // сообщает системе о том что были изменения + break; + case dlg_close_clear: + code_Close_tmp = 0; + SetDlgItemTextA(hDialogWnd, dlg_close_edit, ""); + SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); + break; + case dlg_hide_set: + code_HideShow_tmp = key_code_assign; + HwHotKeys_PrintFullKeyname(key_code_assign); + SetDlgItemTextA(hDialogWnd, dlg_hide_edit, key_name_buffer); + SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); + break; + case dlg_hide_clear: + code_HideShow_tmp = 0; + SetDlgItemTextA(hDialogWnd, dlg_hide_edit, ""); + SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); + break; + case dlg_read_set: + code_ReadMsg_tmp = key_code_assign; + HwHotKeys_PrintFullKeyname(key_code_assign); + SetDlgItemTextA(hDialogWnd, dlg_read_edit, key_name_buffer); + SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); + break; + case dlg_read_clear: + code_ReadMsg_tmp = 0; + SetDlgItemTextA(hDialogWnd, dlg_read_edit, ""); + SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); + break; + } + break; //case WM_COMMAND + + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) + { + case 0: + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: // система просит сохранить настройки плагина + code_Close = code_Close_tmp; + db_set_dw(0, __DbModName, "Close", code_Close_tmp); + code_HideShow = code_HideShow_tmp; + db_set_dw(0, __DbModName, "HideShow", code_HideShow_tmp); + code_ReadMsg = code_ReadMsg_tmp; + db_set_dw(0, __DbModName, "ReadMsg", code_ReadMsg_tmp); + break; //case PSN_APPLY + } + break; //case 0 + } + break; //case WM_NOTIFY + + case WM_DESTROY: + hDialogWnd = 0; // используется для вывода туда в реалтайме сканкодов клавы (пока открыты настройки), 0 (при закрытии диалога) блокирует это + break; + } + + return 0; +} + diff --git a/plugins/HwHotKeys/src/HwHotKeys_DllMain.cpp b/plugins/HwHotKeys/src/HwHotKeys_DllMain.cpp new file mode 100644 index 0000000000..6a36f8e31e --- /dev/null +++ b/plugins/HwHotKeys/src/HwHotKeys_DllMain.cpp @@ -0,0 +1,150 @@ +/* ============================================================================ +Hardware HotKeys plugin for Miranda NG. +Copyright © Eugene f2065, http://f2065.narod.ru, f2065 mail.ru, ICQ 35078112 + +This program is free software; you can redistribute it and / or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 - 1307, USA. +============================================================================ */ + + + +#include "HwHotKeys.h" + +HINSTANCE hInstance; +int hLangpack; +HWND hDialogWnd = 0; // хэндл окна настроек, он глобально используется для вывода туда в реалтайме сканкодов клавы из хука +HHOOK hHook; +CLIST_INTERFACE *pcli; + +// там хранятся настройки - сканкоды кнопок для закрытия/показа/чтения, на которые должны реагировать соответствующие действия +DWORD code_Close = 0; +DWORD code_HideShow = 0; +DWORD code_ReadMsg = 0; +// в _tmp копируются настройки на время диалога настроек +DWORD code_Close_tmp = 0; +DWORD code_HideShow_tmp = 0; +DWORD code_ReadMsg_tmp = 0; +// формат сканкодов тут такой: +// младшие 0...7 биты - это аппаратный сканкод (как он приходит в KbdLLHookStruct.scanCode&0xFF) +// 8 бит - это как бы часть сканкода, флаг LLKHF_EXTENDED ((LOBYTE(KbdLLHookStruct.flags)&1) - часть кнопок с этим флагом +// (авторам 101-кнопочной клавы не хватило 255 сканкодов, т.к. там много старых кнопок которые уже давно вымерли типа F13-F20). +// итак, плагин оперирует 9-битными сканкодами (имена кнопок всех этих сканкодов прописаны в таблице *key_tab[0x200]). +// биты 9-19 - не используются. +// биты 20-31 - это флаги регистров, Shift/Ctrl/Alt/Win. На 4 кнопки - 12 битов. Потому что каждая кнопка 3 имеет бита - левая, правая, или любая. +// битовые маски регистров опеределены в key_flag_sr и соседних именах + +// плагин оперирует 10 - битными "сканкодами" собственного формата. +// младшие 0...7 биты - это обычно аппаратный сканкод (как он приходит в KbdLLHookStruct.scanCode&0xFF) +// 8 бит - это как бы часть сканкода, флаг LLKHF_EXTENDED ((LOBYTE(KbdLLHookStruct.flags)&1) - часть кнопок с этим флагом +// (авторам 101-кнопочной клавы не хватило 255 сканкодов, т.к. там много старых кнопок которые уже давно вымерли типа F13-F20). +// 9 бит - это значит что в битах 0...7 не аппаратный сканкод, а VK-код (KbdLLHookStruct.vkCode), и 8 бит при этом всегда 0. +// сделано это потому что некоторые USB-клавиатуры не выдают в хук аппаратные скандоды, и если там 0 - то будет использован VK-код. +// (имена кнопок всех этих сканкодов прописаны в таблице *key_tab[0x300]). +// биты 10-19 - не используются. +// биты 20-31 - это флаги регистров, Shift/Ctrl/Alt/Win. На 4 кнопки - 12 битов. Потому что каждая кнопка 3 имеет бита - левая, правая, или любая. +// битовые маски регистров опеределены в key_flag_sr и соседних именах + + + + +DWORD key_code = 0; // там постоянно обновляется сканкод текущей нажатой комбинации +DWORD key_code_raw = 0; +DWORD key_code_assign = 0; // во время настроек там хранится сканкод последней нажатой комбинации, который можно назначить для действия. + +CHAR key_name_buffer[150]; // буфер куда печатается имя кнопки в настройках. ANSI. +// Самая длинная в теории строка - «L_Shift + L_Ctrl + L_Alt + L_Win + R_Shift + R_Ctrl + R_Alt + R_Win + MSO_Print, HP_TouchPadOff» - менее 100 букв. + +// ============================================================================ + +BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) +{ + hInstance = hModule; + return TRUE; +} + +// ============================================================================ + +PLUGININFOEX PluginInfoEx = { + sizeof(PLUGININFOEX), + __PLUGIN_NAME, + PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), + __DESCRIPTION_MIR, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + // {315B3800-8258-44C4-B60E-58C50B9303B6} - GUID для плагина HwHotKeys + { 0x315b3800, 0x8258, 0x44c4, { 0xb6, 0xe, 0x58, 0xc5, 0xb, 0x93, 0x3, 0xb6 } } +}; + +extern "C" __declspec(dllexport) PLUGININFOEX * MirandaPluginInfoEx(DWORD) +{ + return &PluginInfoEx; +} + +// ============================================================================ + +extern "C" __declspec(dllexport) int Load(void) +{ + // загружаем (из БД) настройки плагина + code_Close = db_get_dw(0, __DbModName, "Close", 0); + code_HideShow = db_get_dw(0, __DbModName, "HideShow", 0); + code_ReadMsg = db_get_dw(0, __DbModName, "ReadMsg", 0); + + // установка кода локализации - макрос mir_getLP(PlgInfoEx) + mir_getLP(&PluginInfoEx); + + // Интерфейс контактлиста - макрос заполняет CLIST_INTERFACE *pcli; + mir_getCLI(); + + // регистрация диалога опций + HookEvent(ME_OPT_INITIALISE, initializeOptions); + + // установка хука для низкоуровневой обработки хоткеев + hHook = SetWindowsHookExA(WH_KEYBOARD_LL, key_hook, hInstance, 0); + +// StringCbPrintfA(key_name_buffer, 100, "hHook = 0x%x, Err = %u", hHook, GetLastError); +// MessageBoxA(0, key_name_buffer, 0, 0); + + return 0; +} + +// ==================================== + +int initializeOptions(WPARAM wParam, LPARAM) +{ + OPTIONSDIALOGPAGE OptDlgPg = { sizeof(OptDlgPg) }; + OptDlgPg.position = 100000000; + OptDlgPg.hInstance = hInstance; + OptDlgPg.flags = ODPF_BOLDGROUPS | ODPF_TCHAR; + OptDlgPg.pszTemplate = MAKEINTRESOURCEA(dlg_options); + OptDlgPg.ptszGroup = LPGENT("Customize"); + OptDlgPg.ptszTitle = LPGENT(__PLUGIN_NAME); + OptDlgPg.pfnDlgProc = OptDlgProc; + OptDlgPg.hLangpack = hLangpack; + Options_AddPage(wParam, &OptDlgPg); + return 0; +} + +// ============================================================================ + +extern "C" __declspec(dllexport) int Unload(void) +{ + UnhookWindowsHookEx(hHook); + return 0; +} + +// ============================================================================ + diff --git a/plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp b/plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp new file mode 100644 index 0000000000..ac80b69036 --- /dev/null +++ b/plugins/HwHotKeys/src/HwHotKeys_KbdHook.cpp @@ -0,0 +1,133 @@ +/* ============================================================================ +Hardware HotKeys plugin for Miranda NG. +Copyright © Eugene f2065, http://f2065.narod.ru, f2065 mail.ru, ICQ 35078112 + +This program is free software; you can redistribute it and / or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 - 1307, USA. +============================================================================ */ + +#include "HwHotKeys.h" + +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)); + + 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; + } + else if (HwHotKeys_CompareCurrentScancode(code_HideShow)) // хоткей сворачивания/разворачивания главного окна Miranda + { + // Beep(700, 200); + pcli->pfnShowHide(0, 0); // есть варианты + 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 запрещает дальнейшую работу кнопки, т.е. кнопка после нашего плагина никому более не достанется + } + } + } + } + } + } + return CallNextHookEx(hHook, nCode, wParam, lParam); +} diff --git a/plugins/HwHotKeys/src/HwHotKeys_KeyName.cpp b/plugins/HwHotKeys/src/HwHotKeys_KeyName.cpp new file mode 100644 index 0000000000..a372bca19e --- /dev/null +++ b/plugins/HwHotKeys/src/HwHotKeys_KeyName.cpp @@ -0,0 +1,243 @@ +/* ============================================================================ +Hardware HotKeys plugin for Miranda NG. +Copyright © Eugene f2065, http://f2065.narod.ru, f2065 mail.ru, ICQ 35078112 + +This program is free software; you can redistribute it and / or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 - 1307, USA. +============================================================================ */ + +#include "HwHotKeys.h" + +// тут описаны известные имена кнопок по аппаратным сканкодам (KbdLLHookStruct.scanCode & 0xFF) и ((LOBYTE(KbdLLHookStruct.flags)&1) +// и по VK-кодам (KbdLLHookStruct.vkCode) + +// при обнаружении новых кнопок (на мультимедийных клавиатурах) просьба сообщать об этом автору! + + + +// имена для KbdLLHookStruct.scanCode +const CHAR *k000 = "Undefined!"; +const CHAR *k001 = "Esc"; +const CHAR *k002 = "1"; +const CHAR *k003 = "2"; +const CHAR *k004 = "3"; +const CHAR *k005 = "4"; +const CHAR *k006 = "5"; +const CHAR *k007 = "6"; +const CHAR *k008 = "7"; +const CHAR *k009 = "8"; +const CHAR *k00A = "9"; +const CHAR *k00B = "0"; +const CHAR *k00C = "-_"; +const CHAR *k00D = "=+"; +const CHAR *k00E = "Backspace"; +const CHAR *k00F = "Tab"; +const CHAR *k010 = "Q"; +const CHAR *k011 = "W"; +const CHAR *k012 = "E"; +const CHAR *k013 = "R"; +const CHAR *k014 = "T"; +const CHAR *k015 = "Y"; +const CHAR *k016 = "U"; +const CHAR *k017 = "I"; +const CHAR *k018 = "O"; +const CHAR *k019 = "P"; +const CHAR *k01A = "[{"; +const CHAR *k01B = "]}"; +const CHAR *k01C = "Enter"; +const CHAR *k01D = "L_Ctrl"; +const CHAR *k01E = "A"; +const CHAR *k01F = "S"; +const CHAR *k020 = "D"; +const CHAR *k021 = "F"; +const CHAR *k022 = "G"; +const CHAR *k023 = "H"; +const CHAR *k024 = "J"; +const CHAR *k025 = "K"; +const CHAR *k026 = "L"; +const CHAR *k027 = ";:"; +const CHAR *k028 = "\'\""; // '" +const CHAR *k029 = "`~"; +const CHAR *k02A = "L_Shift"; +const CHAR *k02B = "\\|"; +const CHAR *k02C = "Z"; +const CHAR *k02D = "X"; +const CHAR *k02E = "C"; +const CHAR *k02F = "V"; +const CHAR *k030 = "B"; +const CHAR *k031 = "N"; +const CHAR *k032 = "M"; +const CHAR *k033 = ",<"; +const CHAR *k034 = ".>"; +const CHAR *k035 = "/?"; +const CHAR *k036 = "R_Shift"; +const CHAR *k037 = "Keypad_*"; // 37 (Keypad - *) or(*/ PrtScn) on a 83 / 84 - key keyboard +const CHAR *k038 = "L_Alt"; +const CHAR *k039 = "Space"; +const CHAR *k03A = "Caps_Lock"; +const CHAR *k03B = "F1"; +const CHAR *k03C = "F2"; +const CHAR *k03D = "F3"; +const CHAR *k03E = "F4"; +const CHAR *k03F = "F5"; +const CHAR *k040 = "F6"; +const CHAR *k041 = "F7"; +const CHAR *k042 = "F8"; +const CHAR *k043 = "F9"; +const CHAR *k044 = "F10"; +const CHAR *k045 = "Pause"; +const CHAR *k046 = "Scroll_Lock"; +const CHAR *k047 = "Keypad_7_Home"; +const CHAR *k048 = "Keypad_8_Up"; +const CHAR *k049 = "Keypad_9_PageUp"; +const CHAR *k04A = "Keypad_-"; +const CHAR *k04B = "Keypad_4_Left"; +const CHAR *k04C = "Keypad_5"; +const CHAR *k04D = "Keypad_6_Right"; +const CHAR *k04E = "Keypad_+"; +const CHAR *k04F = "Keypad_1_End"; +const CHAR *k050 = "Keypad_2_Down"; +const CHAR *k051 = "Keypad_3_PageDown"; +const CHAR *k052 = "Keypad_0_Insert"; +const CHAR *k053 = "Keypad_._Delete"; +const CHAR *k054 = "Alt_SysRq"; // Alt + PrtScr + +const CHAR *k057 = "F11"; +const CHAR *k058 = "F12"; + +const CHAR *k105 = "Messenger"; + +const CHAR *k107 = "MSO_Redo"; +const CHAR *k108 = "MSO_Undo"; +const CHAR *k10A = "HP_Lock"; +const CHAR *k10E = "HP_DVD"; +const CHAR *k110 = "Media_PrevTrack"; +const CHAR *k116 = "LogOff"; +const CHAR *k119 = "Media_NextTrack"; +const CHAR *k11C = "Keypad_Enter"; +const CHAR *k11D = "R_Ctrl"; +const CHAR *k120 = "Volume_Mute"; +const CHAR *k121 = "Calculator"; +const CHAR *k122 = "Media_Play/Pause"; +const CHAR *k123 = "MSO_Spell"; +const CHAR *k124 = "Media_Stop"; +const CHAR *k12A = "L_Shift_fake"; +const CHAR *k12E = "Volume_Down"; +const CHAR *k130 = "Volume_Up"; +const CHAR *k131 = "HP_Help"; +const CHAR *k132 = "Browser_Start"; +const CHAR *k135 = "Keypad_/"; +const CHAR *k136 = "R_Shift_fake"; +const CHAR *k137 = "PrintScreen"; // ? ? ? no - ext ? +const CHAR *k138 = "R_Alt"; + + +const CHAR *k13B = "MSO_Help"; +const CHAR *k13C = "MyMusic"; +const CHAR *k13E = "MSO_New"; +const CHAR *k13F = "MSO_Open"; +const CHAR *k140 = "MSO_Close"; +const CHAR *k141 = "MSO_Reply"; +const CHAR *k142 = "MSO_Fwd"; +const CHAR *k143 = "MSO_Send"; + +const CHAR *k145 = "Num_Lock"; +const CHAR *k146 = "Ctrl_Break"; // Ctrl + Pause +const CHAR *k147 = "Home"; // grey +const CHAR *k148 = "Up"; // grey +const CHAR *k149 = "PageUp"; // grey +const CHAR *k14B = "Left"; // grey +const CHAR *k14C = "MyDocuments"; +const CHAR *k14D = "Right"; // grey +const CHAR *k14F = "End"; // grey +const CHAR *k150 = "Down"; // grey +const CHAR *k151 = "PageDown"; // grey +const CHAR *k152 = "Insert"; // grey +const CHAR *k153 = "Delete"; // grey + +const CHAR *k157 = "MSO_Save"; +const CHAR *k158 = "MSO_Print,HP_TouchPadOff"; +const CHAR *k159 = "HP_TouchPadOn"; + +const CHAR *k15B = "L_Win"; +const CHAR *k15C = "R_Win"; +const CHAR *k15D = "Context_Menu"; +const CHAR *k15E = "Power"; +const CHAR *k15F = "Sleep"; +const CHAR *k163 = "Wake"; +const CHAR *k164 = "MyPictures"; +const CHAR *k16C = "Mail"; +const CHAR *k16D = "Media_Select"; + +const CHAR *k165 = "Browser_Search"; +const CHAR *k166 = "Browser_Favorites"; +const CHAR *k167 = "Browser_Refresh"; +const CHAR *k168 = "Browser_Stop"; +const CHAR *k169 = "Browser_Forward"; +const CHAR *k16A = "Browser_Back"; + + +// кнопки регистров (Shift,Ctrl,Alt,Win) +const CHAR *t_CL = k01D; +const CHAR *t_CR = k11D; +const CHAR *t_CC = k01D + 2; +const CHAR *t_AL = k038; +const CHAR *t_AR = k138; +const CHAR *t_AA = k038 + 2; +const CHAR *t_WL = k15B; +const CHAR *t_WR = k15C; +const CHAR *t_WW = k038 + 2; +const CHAR *t_SL = k02A; +const CHAR *t_SR = k036; +const CHAR *t_SS = k02A + 2; + + + +const CHAR *key_tab[0x200] +{ + k000, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k00D, k00E, k00F, // 000 - простые KbdLLHookStruct.scanCode + k010, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C, k01D, k01E, k01F, // 010 + k020, k021, k022, k023, k024, k025, k026, k027, k028, k029, k02A, k02B, k02C, k02D, k02E, k02F, // 020 + k030, k031, k032, k033, k034, k035, k036, k037, k038, k039, k03A, k03B, k03C, k03D, k03E, k03F, // 030 + k040, k041, k042, k043, k044, k045, k046, k047, k048, k049, k04A, k04B, k04C, k04D, k04E, k04F, // 040 + k050, k051, k052, k053, k054, k000, k000, k057, k058, k000, k000, k000, k000, k000, k000, k000, // 050 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 060 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 070 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 080 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 090 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 0A0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 0B0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 0C0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 0D0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 0E0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 0F0 + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + k000, k000, k000, k000, k000, k105, k000, k107, k108, k000, k10A, k000, k000, k000, k10E, k000, // 100 - LLKHF_EXTENDED KbdLLHookStruct.scanCode + k110, k000, k000, k000, k000, k000, k116, k000, k000, k119, k000, k000, k11C, k11D, k000, k000, // 110 + k120, k121, k122, k123, k124, k000, k000, k000, k000, k000, k12A, k000, k000, k000, k12E, k000, // 120 + k130, k131, k132, k000, k000, k135, k136, k137, k138, k000, k000, k13B, k13C, k000, k13E, k13F, // 130 + k140, k141, k142, k143, k000, k145, k146, k147, k148, k149, k000, k14B, k14C, k14D, k000, k14F, // 140 + k150, k151, k152, k153, k000, k000, k000, k157, k158, k159, k000, k15B, k15C, k15D, k15E, k15F, // 150 + k000, k000, k000, k163, k164, k165, k166, k167, k168, k169, k16A, k000, k16C, k16D, k000, k000, // 160 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 170 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 180 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 190 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 1A0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 1B0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 1C0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 1D0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 1E0 + k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, k000, // 1F0 + // 0 1 2 3 4 5 6 7 8 9 A B C D E F +}; diff --git a/plugins/HwHotKeys/src/HwHotKeys_Util.cpp b/plugins/HwHotKeys/src/HwHotKeys_Util.cpp new file mode 100644 index 0000000000..cc22aeae7c --- /dev/null +++ b/plugins/HwHotKeys/src/HwHotKeys_Util.cpp @@ -0,0 +1,139 @@ +/* ============================================================================ +Hardware HotKeys plugin for Miranda NG. +Copyright © Eugene f2065, http://f2065.narod.ru, f2065 mail.ru, ICQ 35078112 + +This program is free software; you can redistribute it and / or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 - 1307, USA. +============================================================================ */ + +#include "HwHotKeys.h" + + + +// сравнивает текущий нажатый сканкод с указанным +BOOL HwHotKeys_CompareCurrentScancode(DWORD scancode) +{ + if (key_code == scancode) // key_code - текущий нажатый на клавиатуре сканкод. + { + return true; // сканкод напрямую совпал - TRUE. + } + if (!(scancode & 0x00F00000)) // проверяем нет ли в сканкоде запроса на любой из левого/правого регистра. + { + return false; + } + DWORD tmp1, tmp2; // битовые маски: 0xF0000000 - левые кнопки Sft/Ctr/Alt/Win, 0x0F000000 - правые кнопки, 0x00F00000 - любые кнопки Sft/Ctr/Alt/Win + tmp1 = key_code >> 8; // сдвигаем биты левых и правых кнопок. + tmp2 = key_code >> 4; + tmp1 |= tmp2; + tmp1 &= 0x00F00000; + tmp2 = (key_code | tmp1) & 0x00FFFFFF; + if (tmp2 == scancode) + { + return true; + } + return false; +} + + + +// печатает в буфер key_name_buffer текстовое описание нажатой комбинации кнопок +// Кодировка ANSI (для экономии места, всё равно названия клавиш английские) +VOID HwHotKeys_PrintFullKeyname(DWORD scancode) +{ + key_name_buffer[0] = 0; + if (!scancode) // если нулевой сканкод - то пустую строку делаем. + { + return; + } + + if (scancode & key_flag_sl) // L_Shift + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_SL); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + if (scancode & key_flag_sr) // R_Shift + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_SR); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + if (scancode & key_flag_ss) // Shift + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_SS); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + + if (scancode & key_flag_cl) // L_Ctrl + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_CL); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + if (scancode & key_flag_cr) // R_Ctrl + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_CR); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + if (scancode & key_flag_cc) // Ctrl + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_CC); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + + if (scancode & key_flag_al) // L_Alt + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_AL); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + if (scancode & key_flag_ar) // R_Alt + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_AR); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + if (scancode & key_flag_aa) // Alt + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_AA); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + + if (scancode & key_flag_wl) // L_Win + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_WL); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + if (scancode & key_flag_wr) // R_Win + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_WR); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + if (scancode & key_flag_ww) // Win + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), t_WW); + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), " + "); + } + + if ((scancode & 0x1FF) < sizeof(key_tab)) // защита от ошибочных данных - чтобы не выйти из таблицы имён. + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), key_tab[(scancode & 0x1FF)]); + } + else + { + StringCbCatA(key_name_buffer, sizeof(key_name_buffer), "out of range"); + } + + INT_PTR tmp1 = mir_strlen(key_name_buffer); // допечатываем в конеце строки сканкод - для удобства работы с пока ещё не известными (безимянными) кнопками + StringCbPrintfA(key_name_buffer + tmp1, sizeof(key_name_buffer) - tmp1, " (%03X)", (scancode & 0x1FF)); + + return; +} + + diff --git a/plugins/HwHotKeys/src/HwHotKeys_resource.h b/plugins/HwHotKeys/src/HwHotKeys_resource.h new file mode 100644 index 0000000000..c96893bfcf Binary files /dev/null and b/plugins/HwHotKeys/src/HwHotKeys_resource.h differ diff --git a/plugins/HwHotKeys/src/HwHotKeys_version.h b/plugins/HwHotKeys/src/HwHotKeys_version.h new file mode 100644 index 0000000000..e4d52b0082 --- /dev/null +++ b/plugins/HwHotKeys/src/HwHotKeys_version.h @@ -0,0 +1,41 @@ +/* ============================================================================ +Hardware HotKeys plugin for Miranda NG. +Copyright © Eugene f2065, http://f2065.narod.ru, f2065 mail.ru, ICQ 35078112 + +This program is free software; you can redistribute it and / or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 - 1307, USA. +============================================================================ */ + +// история версий: +// 1.0.0.6 - первая версия Hardware HotKeys для Miranda NG (более ранние версии были для Miranda IM), исправление старых ошибок. + + +#define __MAJOR_VERSION 1 +#define __MINOR_VERSION 0 +#define __RELEASE_NUM 0 +#define __BUILD_NUM 6 + +#include + +#define __PLUGIN_NAME "Hardware HotKeys" // dll-fileinfo "FileVersion" и "ProductName", меню в настройках миранды, название плагина в миранде. Нелокализуемое! +#define __FILENAME "HwHotKeys.dll" // dll-fileinfo "OriginalFilename" +#define __DESCRIPTION_MIR "Hardware HotKeys plugin for Miranda NG\r\nAllows to assign expanded multimedia keys (only for PS/2-keyboards)." // описание плагина в миранде (локализуемое) +#define __DESCRIPTION_DLL "Hardware HotKeys plugin for Miranda NG." // описание плагина в dll-fileinfo "FileDescription" (там многострочные строки - не работают). Нелокализуемое! +#define __AUTHOR "Eugene f2065" // описание плагина в миранде +#define __AUTHOREMAIL "f2065@mail.ru" // описание плагина в миранде +#define __AUTHORWEB "http://f2065.narod.ru/" // описание плагина в dll-fileinfo "CompanyName", описание плагина в миранде +#define __COPYRIGHT "© 2010-2015 Eugene f2065" // описание плагина в dll-fileinfo "LegalCopyright", описание плагина в миранде + +#define __DbModName "HwHotKeys" // имя раздела настроек плагина в БД миранды + diff --git a/plugins/HwHotKeys/src/stdafx.cpp b/plugins/HwHotKeys/src/stdafx.cpp new file mode 100644 index 0000000000..93782795d3 --- /dev/null +++ b/plugins/HwHotKeys/src/stdafx.cpp @@ -0,0 +1,18 @@ +/* +Copyright (C) 2012-15 Miranda NG project (http://miranda-ng.org) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 +of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "HwHotKeys.h" \ No newline at end of file -- cgit v1.2.3