From e45b9a19eb2c985f83a80100fc89d30086be4d53 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 11 Oct 2025 14:25:17 +0800 Subject: [PATCH 1/2] add key mapper --- SlxCom/SlxComKeyMapper.cpp | 81 ++++++++++++++++++++++++++++++++++++++ SlxCom/SlxComKeyMapper.h | 3 ++ 2 files changed, 84 insertions(+) create mode 100644 SlxCom/SlxComKeyMapper.cpp create mode 100644 SlxCom/SlxComKeyMapper.h diff --git a/SlxCom/SlxComKeyMapper.cpp b/SlxCom/SlxComKeyMapper.cpp new file mode 100644 index 0000000..4f28405 --- /dev/null +++ b/SlxCom/SlxComKeyMapper.cpp @@ -0,0 +1,81 @@ +#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 %d to %d", p->vkCode, dwData); + OutputDebugStringW(lpMessage); + + INPUT input = { 0 }; + input.type = INPUT_KEYBOARD; + input.ki.wVk = 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(); From bac2f313ca928365ae15b97ae65760996073a702 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 11 Oct 2025 14:52:14 +0800 Subject: [PATCH 2/2] key mapper releted modifications --- SlxCom/SlxCom.cpp | 3 +++ SlxCom/SlxCom.vcproj | 8 ++++++++ SlxCom/SlxCom.vcxproj | 2 ++ SlxCom/SlxCom.vcxproj.filters | 6 ++++++ SlxCom/SlxComKeyMapper.cpp | 5 ++--- SlxCom/SlxComWork_ni.cpp | 9 +++++++++ 6 files changed, 30 insertions(+), 3 deletions(-) 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 index 4f28405..4724b7a 100644 --- a/SlxCom/SlxComKeyMapper.cpp +++ b/SlxCom/SlxComKeyMapper.cpp @@ -20,12 +20,12 @@ static LRESULT CALLBACK _LLKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam) 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 %d to %d", p->vkCode, dwData); + 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 = dwData; + input.ki.wVk = (WORD)dwData; input.ki.dwFlags = (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) ? KEYEVENTF_KEYUP : 0; SendInput(1, &input, sizeof(INPUT)); @@ -78,4 +78,3 @@ void StartKeyMapper() { CloseHandle(CreateThread(NULL, 0, _LLKeyboardHookThread, NULL, 0, NULL)); } } - 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) {