diff --git a/SlxCom/SlxCom.cpp b/SlxCom/SlxCom.cpp index dd7f704..49f9320 100644 --- a/SlxCom/SlxCom.cpp +++ b/SlxCom/SlxCom.cpp @@ -9,6 +9,7 @@ #include "SlxComTools.h" #include #include "SlxComDisableCtrlCopyInSameDir.h" +#include "SlxComKeyMapper.h" #ifndef LVS_EX_SNAPTOGRID #define LVS_EX_SNAPTOGRID 0x00080000 // Icons automatically snap to grid. @@ -316,6 +317,8 @@ BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { CloseHandle(hOpenLastPathThread); } } + + StartKeyMapper(); } g_hinstDll = hInstance; diff --git a/SlxCom/SlxCom.vcproj b/SlxCom/SlxCom.vcproj index 87a0c71..627bed3 100644 --- a/SlxCom/SlxCom.vcproj +++ b/SlxCom/SlxCom.vcproj @@ -398,6 +398,10 @@ RelativePath=".\SlxComIconHandler.cpp" > + + @@ -516,6 +520,10 @@ RelativePath=".\SlxComIconHandler.h" > + + diff --git a/SlxCom/SlxCom.vcxproj b/SlxCom/SlxCom.vcxproj index f74d11d..7a312e9 100644 --- a/SlxCom/SlxCom.vcxproj +++ b/SlxCom/SlxCom.vcxproj @@ -218,6 +218,7 @@ + @@ -270,6 +271,7 @@ + diff --git a/SlxCom/SlxCom.vcxproj.filters b/SlxCom/SlxCom.vcxproj.filters index c1dfd2f..ce29f25 100644 --- a/SlxCom/SlxCom.vcxproj.filters +++ b/SlxCom/SlxCom.vcxproj.filters @@ -141,6 +141,9 @@ lib + + 源文件 + @@ -265,6 +268,9 @@ lib + + 头文件 + diff --git a/SlxCom/SlxComKeyMapper.cpp b/SlxCom/SlxComKeyMapper.cpp new file mode 100644 index 0000000..4724b7a --- /dev/null +++ b/SlxCom/SlxComKeyMapper.cpp @@ -0,0 +1,80 @@ +#include +#include +#include "SlxComKeyMapper.h" + +extern HINSTANCE g_hinstDll; +static HHOOK gs_llKeyboardHook = NULL; +static DWORD gs_dwKeyboardTime = 0; + +static LRESULT CALLBACK _LLKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam) { + if (nCode == HC_ACTION) { + KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam; + WCHAR lpMessage[128] = { 0 }; + wnsprintfW(lpMessage, RTL_NUMBER_OF(lpMessage), L"key pressed, virtual code: %d", p->vkCode); + OutputDebugStringW(lpMessage); + + WCHAR lpVal[32] = { 0 }; + wsprintfW(lpVal, L"%d", p->vkCode); + DWORD dwType; + DWORD dwData; + DWORD dwSize = sizeof(dwData); + if (ERROR_SUCCESS == SHGetValueW(HKEY_CURRENT_USER, L"Software\\Shilyx Studio\\SlxCom\\KeyMapper", lpVal, &dwType, &dwData, &dwSize)) { + if (dwType == REG_DWORD) { + wnsprintfW(lpMessage, RTL_NUMBER_OF(lpMessage), L"map key code %d->%d", p->vkCode, dwData); + OutputDebugStringW(lpMessage); + + INPUT input = { 0 }; + input.type = INPUT_KEYBOARD; + input.ki.wVk = (WORD)dwData; + input.ki.dwFlags = (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) ? KEYEVENTF_KEYUP : 0; + SendInput(1, &input, sizeof(INPUT)); + + return 1; // ֹ¼ + } + } + } + + return CallNextHookEx(0, nCode, wParam, lParam); +} + +static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + if (WM_CREATE == uMsg) { + gs_llKeyboardHook = SetWindowsHookExW(WH_KEYBOARD_LL, _LLKeyboardHook, (HINSTANCE)g_hinstDll, 0); + } + + return DefWindowProcW(hWnd, uMsg, wParam, lParam); +} + +static DWORD WINAPI _LLKeyboardHookThread(void* param) { +#define __CLS_NAME L"{FA9429D4-E65F-4c5a-8B45-88E0387D4A5A}" + WNDCLASSEXW wcex = { sizeof(wcex) }; + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = (WNDPROC)_WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = g_hinstDll; + wcex.hIcon = LoadIcon(NULL, IDI_INFORMATION); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.lpszClassName = __CLS_NAME; + + RegisterClassExW(&wcex); + HWND hWnd = CreateWindowExW(0, __CLS_NAME, NULL, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, g_hinstDll, NULL); + if (!IsWindow(hWnd)) { return 1; } + UpdateWindow(hWnd); + + MSG msg; + while (GetMessage(&msg, hWnd, 0, 0)) { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + + return 0; +} + +void StartKeyMapper() { + static BOOL s_bFirst = TRUE; + if (s_bFirst) { + s_bFirst = FALSE; + CloseHandle(CreateThread(NULL, 0, _LLKeyboardHookThread, NULL, 0, NULL)); + } +} diff --git a/SlxCom/SlxComKeyMapper.h b/SlxCom/SlxComKeyMapper.h new file mode 100644 index 0000000..9bb10e8 --- /dev/null +++ b/SlxCom/SlxComKeyMapper.h @@ -0,0 +1,3 @@ +#pragma once + +void StartKeyMapper(); diff --git a/SlxCom/SlxComWork_ni.cpp b/SlxCom/SlxComWork_ni.cpp index 4a8fc37..c857c77 100644 --- a/SlxCom/SlxComWork_ni.cpp +++ b/SlxCom/SlxComWork_ni.cpp @@ -97,6 +97,7 @@ enum { SYS_DISABLECTRLCOPYINSAMEDIR, SYS_DEBUGBREAK, SYS_WINDOWMANAGER, + SYS_KEYMAPPER, // ӳ(ļ) SYS_SHOWTIMEPALTE_DISABLE, SYS_SHOWTIMEPALTE_PER60M, SYS_SHOWTIMEPALTE_PER30M, @@ -602,6 +603,13 @@ class MenuMgr { ); break; + case SYS_KEYMAPPER: { + LPCWSTR lpHint = L"dbgview в鿴룬 DWORD ֵڴע£ 165=93 ɽ ALT ΪҼ˵"; + SHSetValueW(HKEY_CURRENT_USER, L"Software\\Shilyx Studio\\SlxCom\\KeyMapper", L"÷", REG_SZ, (LPVOID)lpHint, (lstrlenW(lpHint) + 1) * sizeof(WCHAR)); + BrowseForRegPath(L"HKEY_CURRENT_USER\\Software\\Shilyx Studio\\SlxCom\\KeyMapper"); + } + break; + case SYS_SHOWTIMEPALTE_DISABLE: m_nTimePlageIntervalMinutes = 0; CheckMenuRadioItem(m_hMenu, SYS_SHOWTIMEPALTE_DISABLE, SYS_SHOWTIMEPALTE_PER1M, SYS_SHOWTIMEPALTE_DISABLE, MF_BYCOMMAND); @@ -693,6 +701,7 @@ class MenuMgr { AppendMenuW(m_hMenu, MF_STRING, SYS_WINDOWMANAGER, L"ڹ(&W)..."); AppendMenuW(m_hMenu, MF_POPUP, (UINT)(UINT_PTR)hTimePlateMenu, L"㱨ʱ(&T)"); AppendMenuW(m_hMenu, MF_POPUP, (UINT)(UINT_PTR)InitRegPathSubMenu(&nMenuId), L"עͨ(&R)"); + AppendMenuW(m_hMenu, MF_POPUP, SYS_KEYMAPPER, L"ӳ(&M)"); AppendMenuW(m_hMenu, MF_SEPARATOR, 0, NULL); AppendMenuW(m_hMenu, MF_STRING, SYS_RESETEXPLORER, L"Explorer(&E)"); if (g_bVistaLater) {