|
1 | 1 | #include <Windows.h> |
2 | | - |
3 | | -using namespace std; |
| 2 | +#include <version.h> |
4 | 3 |
|
5 | 4 | HHOOK hHook = 0; |
| 5 | +bool isWindows10 = GetRealOSVersion().dwMajorVersion >= 10; |
| 6 | +bool wasPressed = false; |
6 | 7 |
|
7 | 8 | LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { |
8 | 9 | if (nCode == HC_ACTION) { |
9 | 10 | KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam; |
10 | 11 |
|
11 | 12 | if (p->vkCode == VK_CAPITAL) { |
12 | | - if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) { |
| 13 | + if (wParam == WM_KEYDOWN) { |
13 | 14 | if (GetKeyState(VK_CAPITAL)) { |
14 | 15 | UnhookWindowsHookEx(hHook); |
15 | 16 | keybd_event(VK_CAPITAL, 0x3a, 0, 0); |
16 | 17 | keybd_event(VK_CAPITAL, 0x3a, KEYEVENTF_KEYUP, 0); |
17 | 18 | hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0); |
18 | 19 | } |
19 | 20 |
|
20 | | - HWND hWnd = GetForegroundWindow(); |
21 | | - if (hWnd) { |
22 | | - hWnd = GetAncestor(hWnd, GA_ROOTOWNER); |
23 | | - PostMessage(hWnd, WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)HKL_NEXT); |
| 21 | + if (isWindows10 && !wasPressed) { |
| 22 | + wasPressed = true; |
| 23 | + keybd_event(VK_LWIN, 0x3a, 0, 0); |
| 24 | + keybd_event(VK_SPACE, 0x3a, 0, 0); |
| 25 | + } |
| 26 | + } |
| 27 | + |
| 28 | + if (wParam == WM_KEYUP) { |
| 29 | + if (isWindows10) { |
| 30 | + keybd_event(VK_LWIN, 0x3a, KEYEVENTF_KEYUP, 0); |
| 31 | + keybd_event(VK_SPACE, 0x3a, KEYEVENTF_KEYUP, 0); |
| 32 | + wasPressed = false; |
| 33 | + } else { |
| 34 | + HWND hWnd = GetForegroundWindow(); |
| 35 | + if (hWnd) { |
| 36 | + hWnd = GetAncestor(hWnd, GA_ROOTOWNER); |
| 37 | + PostMessage(hWnd, WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)HKL_NEXT); |
| 38 | + } |
24 | 39 | } |
25 | 40 | } |
26 | 41 |
|
|
0 commit comments