Skip to content

Commit f3b8cc3

Browse files
committed
[Win] Fix some issues on Windows
1 parent 388b449 commit f3b8cc3

File tree

3 files changed

+49
-34
lines changed

3 files changed

+49
-34
lines changed

Sources/OpenKey/engine/Engine.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ static vector<Uint8> _charKeyCode = {
2121
static vector<Uint8> _breakCode = {
2222
KEY_ESC, KEY_TAB, KEY_ENTER, KEY_RETURN, KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP, KEY_COMMA, KEY_DOT,
2323
KEY_SLASH, KEY_SEMICOLON, KEY_QUOTE, KEY_BACK_SLASH, KEY_MINUS, KEY_EQUALS, KEY_BACKQUOTE, KEY_TAB
24+
#if _WIN32
25+
, VK_INSERT, VK_HOME, VK_END, VK_DELETE, VK_PRIOR, VK_NEXT, VK_SNAPSHOT, VK_PRINT, VK_SELECT, VK_HELP,
26+
VK_EXECUTE, VK_NUMLOCK, VK_SCROLL
27+
#endif
2428
};
2529

2630
static vector<Uint8> _macroBreakCode = {
@@ -1225,8 +1229,8 @@ void vSetCheckSpelling() {
12251229
_useSpellCheckingBefore = vCheckSpelling;
12261230
}
12271231

1228-
void vTempOffEngine() {
1229-
_willTempOffEngine = true;
1232+
void vTempOffEngine(const bool& off) {
1233+
_willTempOffEngine = off;
12301234
}
12311235

12321236
bool checkQuickConsonant() {

Sources/OpenKey/engine/Engine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ void vSetCheckSpelling();
228228
/**
229229
* temporarily turn off OpenKey engine
230230
*/
231-
void vTempOffEngine();
231+
void vTempOffEngine(const bool& off=true);
232232

233233
/**
234234
* some utils function

Sources/OpenKey/win32/OpenKey/OpenKey/OpenKey.cpp

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ static string macroText, macroContent;
5959
static int _languageTemp = 0; //use for smart switch key
6060
static vector<Byte> savedSmartSwitchKeyData; ////use for smart switch key
6161

62+
static bool _hasJustUsedHotKey = false;
63+
6264
static INPUT backspaceEvent[2];
6365
static INPUT keyEvent[2];
6466

@@ -208,18 +210,16 @@ static void SendKeyCode(Uint32 data) {
208210
if (IS_DOUBLE_CODE(vCodeTable)) //VNI
209211
InsertKeyLength(1);
210212

211-
if (data & CAPS_MASK && !((_flag & MASK_SHIFT) || (_flag & MASK_CAPITAL))) {
212-
prepareKeyEvent(keyEvent[0], KEY_LEFT_SHIFT, true);
213-
SendInput(1, keyEvent, sizeof(INPUT));
214-
}
215-
216-
prepareKeyEvent(keyEvent[0], _newChar, true);
217-
prepareKeyEvent(keyEvent[1], _newChar, false);
218-
SendInput(2, keyEvent, sizeof(INPUT));
219-
220-
if (data & CAPS_MASK && !((_flag & MASK_SHIFT) || (_flag & MASK_CAPITAL))) {
221-
prepareKeyEvent(keyEvent[0], KEY_LEFT_SHIFT, false);
222-
SendInput(1, keyEvent, sizeof(INPUT));
213+
_newChar = keyCodeToCharacter(data);
214+
if (_newChar == 0) {
215+
_newChar = (Uint16)data;
216+
prepareKeyEvent(keyEvent[0], _newChar, true);
217+
prepareKeyEvent(keyEvent[1], _newChar, false);
218+
SendInput(2, keyEvent, sizeof(INPUT));
219+
} else {
220+
prepareUnicodeEvent(keyEvent[0], _newChar, true);
221+
prepareUnicodeEvent(keyEvent[1], _newChar, false);
222+
SendInput(2, keyEvent, sizeof(INPUT));
223223
}
224224
} else {
225225
if (vCodeTable == 0) { //unicode 2 bytes code
@@ -265,7 +265,8 @@ static void SendKeyCode(Uint32 data) {
265265
static void SendBackspace() {
266266
SendInput(2, backspaceEvent, sizeof(INPUT));
267267
if (vSupportMetroApp && OpenKeyHelper::getLastAppExecuteName().compare("ApplicationFrameHost.exe") == 0) {//Metro App
268-
SendMessage(HWND_BROADCAST, WM_CHAR, VK_BACK, 0);
268+
SendMessage(HWND_BROADCAST, WM_CHAR, VK_BACK, 0L);
269+
SendMessage(HWND_BROADCAST, WM_CHAR, VK_BACK, 0L);
269270
}
270271
if (IS_DOUBLE_CODE(vCodeTable)) { //VNI or Unicode Compound
271272
if (_syncKey.back() > 1) {
@@ -274,7 +275,8 @@ static void SendBackspace() {
274275
}*/
275276
SendInput(2, backspaceEvent, sizeof(INPUT));
276277
if (vSupportMetroApp && OpenKeyHelper::getLastAppExecuteName().compare("ApplicationFrameHost.exe") == 0) {//Metro App
277-
SendMessage(HWND_BROADCAST, WM_CHAR, VK_BACK, 0);
278+
SendMessage(HWND_BROADCAST, WM_CHAR, VK_BACK, 0L);
279+
SendMessage(HWND_BROADCAST, WM_CHAR, VK_BACK, 0L);
278280
}
279281
}
280282
_syncKey.pop_back();
@@ -400,11 +402,11 @@ void switchLanguage() {
400402
if (HAS_BEEP(vSwitchKeyStatus))
401403
MessageBeep(MB_OK);
402404
AppDelegate::getInstance()->onInputMethodChangedFromHotKey();
403-
startNewSession();
404405
if (vUseSmartSwitchKey) {
405406
setAppInputMethodStatus(OpenKeyHelper::getFrontMostAppExecuteName(), vLanguage | (vCodeTable << 1));
406407
saveSmartSwitchKeyData();
407408
}
409+
startNewSession();
408410
}
409411

410412
static void SendPureCharacter(const Uint16& ch) {
@@ -494,55 +496,59 @@ LRESULT CALLBACK keyboardHookProcess(int nCode, WPARAM wParam, LPARAM lParam) {
494496
//LOG(L"Key up: %d\n", keyboardData->vkCode);
495497
UnsetModifierMask((Uint16)keyboardData->vkCode);
496498
}
497-
if (!_isFlagKey)
499+
if (!_isFlagKey && wParam != WM_KEYUP && wParam != WM_SYSKEYUP)
498500
_keycode = (Uint16)keyboardData->vkCode;
499501

500502
//switch language shortcut; convert hotkey
501-
if (wParam == WM_KEYDOWN && !_isFlagKey && _keycode != 0) {
503+
if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && !_isFlagKey && _keycode != 0) {
502504
if (GET_SWITCH_KEY(vSwitchKeyStatus) != _keycode && GET_SWITCH_KEY(convertToolHotKey) != _keycode) {
503505
_lastFlag = 0;
504506
} else {
505507
if (GET_SWITCH_KEY(vSwitchKeyStatus) == _keycode && checkHotKey(vSwitchKeyStatus, GET_SWITCH_KEY(vSwitchKeyStatus) != 0xFE)) {
506508
switchLanguage();
507-
_lastFlag = 0;
509+
_hasJustUsedHotKey = true;
508510
_keycode = 0;
509511
return -1;
510512
}
511513
if (GET_SWITCH_KEY(convertToolHotKey) == _keycode && checkHotKey(convertToolHotKey, GET_SWITCH_KEY(convertToolHotKey) != 0xFE)) {
512514
AppDelegate::getInstance()->onQuickConvert();
513-
_lastFlag = 0;
515+
_hasJustUsedHotKey = true;
514516
_keycode = 0;
515517
return -1;
516518
}
517519
}
520+
_hasJustUsedHotKey = _lastFlag != 0;
518521
} else if (_isFlagKey) {
519522
if (_lastFlag == 0 || _lastFlag < _flag)
520523
_lastFlag = _flag;
521524
else if (_lastFlag > _flag) {
522-
//check temporarily turn off spell checking
523-
if (vTempOffSpelling && _lastFlag & MASK_CONTROL) {
524-
vTempOffSpellChecking();
525-
}
526-
if (vTempOffOpenKey && _lastFlag & MASK_ALT) {
527-
vTempOffEngine();
528-
}
529525
//check switch
530526
if (checkHotKey(vSwitchKeyStatus, GET_SWITCH_KEY(vSwitchKeyStatus) != 0xFE)) {
531527
switchLanguage();
528+
_hasJustUsedHotKey = true;
532529
}
533530
if (checkHotKey(convertToolHotKey, GET_SWITCH_KEY(convertToolHotKey) != 0xFE)) {
534531
AppDelegate::getInstance()->onQuickConvert();
532+
_hasJustUsedHotKey = true;
535533
}
536-
_lastFlag = 0;
534+
//check temporarily turn off spell checking
535+
if (vTempOffSpelling && !_hasJustUsedHotKey && _lastFlag & MASK_CONTROL) {
536+
vTempOffSpellChecking();
537+
}
538+
if (vTempOffOpenKey && !_hasJustUsedHotKey && _lastFlag & MASK_ALT) {
539+
vTempOffEngine();
540+
}
541+
_lastFlag = _flag;
542+
_hasJustUsedHotKey = false;
537543
}
538544
_keycode = 0;
539545
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
540546
}
541547

542548
//if is in english mode
543549
if (vLanguage == 0) {
544-
if (vUseMacro && vUseMacroInEnglishMode && wParam == WM_KEYDOWN) {
545-
vEnglishMode((wParam == WM_KEYDOWN ? vKeyEventState::KeyDown : vKeyEventState::MouseDown),
550+
if (vUseMacro && vUseMacroInEnglishMode && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)) {
551+
vEnglishMode(((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) ? vKeyEventState::KeyDown : vKeyEventState::MouseDown),
546552
_keycode,
547553
(_flag & MASK_SHIFT) || (_flag & MASK_CAPITAL),
548554
OTHER_CONTROL_KEY);
@@ -556,7 +562,7 @@ LRESULT CALLBACK keyboardHookProcess(int nCode, WPARAM wParam, LPARAM lParam) {
556562
}
557563

558564
//handle keyboard
559-
if (wParam == WM_KEYDOWN) {
565+
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
560566
//send event signal to Engine
561567
vKeyHandleEvent(vKeyEvent::Keyboard,
562568
vKeyEventState::KeyDown,
@@ -656,21 +662,26 @@ VOID CALLBACK winEventProcCallback(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, H
656662
if (exe.compare("explorer.exe") == 0) //dont apply with windows explorer
657663
return;
658664
_languageTemp = getAppInputMethodStatus(exe, vLanguage | (vCodeTable << 1));
665+
vTempOffEngine(false);
659666
if (vUseSmartSwitchKey && (_languageTemp & 0x01) != vLanguage) {
660667
if (_languageTemp != -1) {
661668
vLanguage = _languageTemp;
662669
AppDelegate::getInstance()->onInputMethodChangedFromHotKey();
663-
startNewSession();
664670
} else {
665671
saveSmartSwitchKeyData();
666672
}
667673
}
674+
startNewSession();
668675
if (vRememberCode && (_languageTemp >> 1) != vCodeTable) { //for remember table code feature
669676
if (_languageTemp != -1) {
670677
AppDelegate::getInstance()->onTableCode(_languageTemp >> 1);
671678
} else {
672679
saveSmartSwitchKeyData();
673680
}
674681
}
682+
if (vSupportMetroApp && exe.compare("ApplicationFrameHost.exe") == 0) {//Metro App
683+
SendMessage(HWND_BROADCAST, WM_CHAR, VK_BACK, 0L);
684+
SendMessage(HWND_BROADCAST, WM_CHAR, VK_BACK, 0L);
685+
}
675686
}
676687
}

0 commit comments

Comments
 (0)