@@ -59,6 +59,8 @@ static string macroText, macroContent;
59
59
static int _languageTemp = 0 ; // use for smart switch key
60
60
static vector<Byte > savedSmartSwitchKeyData; // //use for smart switch key
61
61
62
+ static bool _hasJustUsedHotKey = false ;
63
+
62
64
static INPUT backspaceEvent[2 ];
63
65
static INPUT keyEvent[2 ];
64
66
@@ -208,18 +210,16 @@ static void SendKeyCode(Uint32 data) {
208
210
if (IS_DOUBLE_CODE (vCodeTable)) // VNI
209
211
InsertKeyLength (1 );
210
212
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));
223
223
}
224
224
} else {
225
225
if (vCodeTable == 0 ) { // unicode 2 bytes code
@@ -265,7 +265,8 @@ static void SendKeyCode(Uint32 data) {
265
265
static void SendBackspace () {
266
266
SendInput (2 , backspaceEvent, sizeof (INPUT));
267
267
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 );
269
270
}
270
271
if (IS_DOUBLE_CODE (vCodeTable)) { // VNI or Unicode Compound
271
272
if (_syncKey.back () > 1 ) {
@@ -274,7 +275,8 @@ static void SendBackspace() {
274
275
}*/
275
276
SendInput (2 , backspaceEvent, sizeof (INPUT));
276
277
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 );
278
280
}
279
281
}
280
282
_syncKey.pop_back ();
@@ -400,11 +402,11 @@ void switchLanguage() {
400
402
if (HAS_BEEP (vSwitchKeyStatus))
401
403
MessageBeep (MB_OK);
402
404
AppDelegate::getInstance ()->onInputMethodChangedFromHotKey ();
403
- startNewSession ();
404
405
if (vUseSmartSwitchKey) {
405
406
setAppInputMethodStatus (OpenKeyHelper::getFrontMostAppExecuteName (), vLanguage | (vCodeTable << 1 ));
406
407
saveSmartSwitchKeyData ();
407
408
}
409
+ startNewSession ();
408
410
}
409
411
410
412
static void SendPureCharacter (const Uint16& ch) {
@@ -494,55 +496,59 @@ LRESULT CALLBACK keyboardHookProcess(int nCode, WPARAM wParam, LPARAM lParam) {
494
496
// LOG(L"Key up: %d\n", keyboardData->vkCode);
495
497
UnsetModifierMask ((Uint16)keyboardData->vkCode );
496
498
}
497
- if (!_isFlagKey)
499
+ if (!_isFlagKey && wParam != WM_KEYUP && wParam != WM_SYSKEYUP )
498
500
_keycode = (Uint16)keyboardData->vkCode ;
499
501
500
502
// switch language shortcut; convert hotkey
501
- if (wParam == WM_KEYDOWN && !_isFlagKey && _keycode != 0 ) {
503
+ if (( wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && !_isFlagKey && _keycode != 0 ) {
502
504
if (GET_SWITCH_KEY (vSwitchKeyStatus) != _keycode && GET_SWITCH_KEY (convertToolHotKey) != _keycode) {
503
505
_lastFlag = 0 ;
504
506
} else {
505
507
if (GET_SWITCH_KEY (vSwitchKeyStatus) == _keycode && checkHotKey (vSwitchKeyStatus, GET_SWITCH_KEY (vSwitchKeyStatus) != 0xFE )) {
506
508
switchLanguage ();
507
- _lastFlag = 0 ;
509
+ _hasJustUsedHotKey = true ;
508
510
_keycode = 0 ;
509
511
return -1 ;
510
512
}
511
513
if (GET_SWITCH_KEY (convertToolHotKey) == _keycode && checkHotKey (convertToolHotKey, GET_SWITCH_KEY (convertToolHotKey) != 0xFE )) {
512
514
AppDelegate::getInstance ()->onQuickConvert ();
513
- _lastFlag = 0 ;
515
+ _hasJustUsedHotKey = true ;
514
516
_keycode = 0 ;
515
517
return -1 ;
516
518
}
517
519
}
520
+ _hasJustUsedHotKey = _lastFlag != 0 ;
518
521
} else if (_isFlagKey) {
519
522
if (_lastFlag == 0 || _lastFlag < _flag)
520
523
_lastFlag = _flag;
521
524
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
- }
529
525
// check switch
530
526
if (checkHotKey (vSwitchKeyStatus, GET_SWITCH_KEY (vSwitchKeyStatus) != 0xFE )) {
531
527
switchLanguage ();
528
+ _hasJustUsedHotKey = true ;
532
529
}
533
530
if (checkHotKey (convertToolHotKey, GET_SWITCH_KEY (convertToolHotKey) != 0xFE )) {
534
531
AppDelegate::getInstance ()->onQuickConvert ();
532
+ _hasJustUsedHotKey = true ;
535
533
}
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 ;
537
543
}
538
544
_keycode = 0 ;
539
545
return CallNextHookEx (hKeyboardHook, nCode, wParam, lParam);
540
546
}
541
547
542
548
// if is in english mode
543
549
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),
546
552
_keycode,
547
553
(_flag & MASK_SHIFT) || (_flag & MASK_CAPITAL),
548
554
OTHER_CONTROL_KEY);
@@ -556,7 +562,7 @@ LRESULT CALLBACK keyboardHookProcess(int nCode, WPARAM wParam, LPARAM lParam) {
556
562
}
557
563
558
564
// handle keyboard
559
- if (wParam == WM_KEYDOWN) {
565
+ if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN ) {
560
566
// send event signal to Engine
561
567
vKeyHandleEvent (vKeyEvent::Keyboard,
562
568
vKeyEventState::KeyDown,
@@ -656,21 +662,26 @@ VOID CALLBACK winEventProcCallback(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, H
656
662
if (exe.compare (" explorer.exe" ) == 0 ) // dont apply with windows explorer
657
663
return ;
658
664
_languageTemp = getAppInputMethodStatus (exe, vLanguage | (vCodeTable << 1 ));
665
+ vTempOffEngine (false );
659
666
if (vUseSmartSwitchKey && (_languageTemp & 0x01 ) != vLanguage) {
660
667
if (_languageTemp != -1 ) {
661
668
vLanguage = _languageTemp;
662
669
AppDelegate::getInstance ()->onInputMethodChangedFromHotKey ();
663
- startNewSession ();
664
670
} else {
665
671
saveSmartSwitchKeyData ();
666
672
}
667
673
}
674
+ startNewSession ();
668
675
if (vRememberCode && (_languageTemp >> 1 ) != vCodeTable) { // for remember table code feature
669
676
if (_languageTemp != -1 ) {
670
677
AppDelegate::getInstance ()->onTableCode (_languageTemp >> 1 );
671
678
} else {
672
679
saveSmartSwitchKeyData ();
673
680
}
674
681
}
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
+ }
675
686
}
676
687
}
0 commit comments