@@ -383,7 +383,7 @@ void ViKeyHandler::_QueueEndOfSelfSendKey(vector<INPUT> *inputs)
383383 }
384384}
385385
386- void ViKeyHandler::_SendInputs (vector<INPUT> *inputs)
386+ void ViKeyHandler::_SendInputs (vector<INPUT> *inputs, vector<INPUT> *inputs2, int waitms )
387387{
388388 // cf. deleter.UnsetModifiers()
389389 mozc::win32::KeyboardStatus keyboard_state;
@@ -399,27 +399,46 @@ void ViKeyHandler::_SendInputs(vector<INPUT> *inputs)
399399 to_be_updated = true ;
400400 keyboard_state.SetState (VK_SHIFT, kUnsetState );
401401 _QueueKeyForModifier (inputs, VK_SHIFT, TRUE , TRUE );
402- // restore modifier
403- // XXX:SendInput()直後にdeleter.EndDeletion()を呼んでも、
404- // CTRL-F押下時にVK_NEXT送り付けても動かない
405- // (おそらくCTRL押下状態になってCTRL-NEXTになるため)
406- _QueueKeyForModifier (inputs, VK_SHIFT, FALSE );
402+ if (inputs2 == NULL )
403+ {
404+ // restore modifier
405+ // XXX:SendInput()直後にdeleter.EndDeletion()を呼んでも、
406+ // CTRL-F押下時にVK_NEXT送り付けても動かない
407+ // (おそらくCTRL押下状態になってCTRL-NEXTになるため)
408+ _QueueKeyForModifier (inputs, VK_SHIFT, FALSE );
409+ }
407410 }
408411 if (keyboard_state.IsPressed (VK_CONTROL))
409412 {
410413 controlPressed = true ;
411414 to_be_updated = true ;
412415 keyboard_state.SetState (VK_CONTROL, kUnsetState );
413416 _QueueKeyForModifier (inputs, VK_CONTROL, TRUE , TRUE );
414- _QueueKeyForModifier (inputs, VK_CONTROL, FALSE );
417+ if (inputs2 == NULL )
418+ {
419+ _QueueKeyForModifier (inputs, VK_CONTROL, FALSE );
420+ }
415421 }
416422 if (to_be_updated)
417423 {
418424 keyboard_->SetKeyboardState (keyboard_state);
419425 }
420426 }
421-
422427 keyboard_->SendInput (*inputs);
428+
429+ if (inputs2 != NULL )
430+ {
431+ if (shiftPressed)
432+ {
433+ _QueueKeyForModifier (inputs2, VK_SHIFT, FALSE );
434+ }
435+ if (controlPressed)
436+ {
437+ _QueueKeyForModifier (inputs2, VK_CONTROL, FALSE );
438+ }
439+ ::Sleep (waitms);
440+ keyboard_->SendInput (*inputs2);
441+ }
423442}
424443
425444void ViKeyHandler::_SendKey (UINT vk, int count)
@@ -494,21 +513,33 @@ static HRESULT _QueueKeyForOtherIme(vector<INPUT> *inputs, WCHAR method, int par
494513 return S_OK;
495514}
496515
497- void ViKeyHandler::SwitchToOtherIme (WCHAR method, int param, BOOL imalnum)
516+ void ViKeyHandler::SwitchToOtherIme (WCHAR method, int param, BOOL imalnum, int otherimeoffwait )
498517{
499518 vector<INPUT> inputs;
500- if (_QueueKeyForOtherIme (&inputs, method, param) == S_OK)
519+ if (_QueueKeyForOtherIme (&inputs, method, param) != S_OK)
520+ {
521+ return ;
522+ }
523+ // 切り替えた後のIMEをONにする。
524+ // XXX: IMEがVK_KANJIでONになることを想定。(ON/OFFトグルでなく)
525+ _QueueKey (&inputs, VK_KANJI);
526+ if (otherimeoffwait == 0 || !imalnum)
501527 {
502- // 切り替えた後のIMEをONにする。
503- // XXX: IMEがVK_KANJIでONになることを想定。(ON/OFFトグルでなく)
504- _QueueKey (&inputs, VK_KANJI);
505528 if (imalnum)
506529 {
507530 // 切り替えた後のIMEを英数モードにする。
508531 _QueueKey (&inputs, VK_OEM_ATTN); // VK_DBE_ALPHANUMERIC
509532 }
510533 _SendInputs (&inputs);
534+ return ;
511535 }
536+
537+ // XXX: Win8だと、imalnumの場合に、1度に送り付けると無視されるので、
538+ // Sleep()を入れて2回に分けて送り付ける
539+ vector<INPUT> alnuminputs;
540+ // 切り替えた後のIMEを英数モードにする。
541+ _QueueKey (&alnuminputs, VK_OEM_ATTN); // VK_DBE_ALPHANUMERIC
542+ _SendInputs (&inputs, &alnuminputs, otherimeoffwait);
512543}
513544
514545void ViKeyHandler::_ViOp (vector<INPUT> *inputs)
0 commit comments