用HOOK来做,比如你按了s捡,就发送Ctrl+Alt+Del按下的消息

解决方案 »

  1.   

    应该是虚拟机加了底层键盘hook,如果有焦点它把所有键盘输入接管交给虚拟机处理了,上层输入法当然无法获知键盘已经按下。
      

  2.   

         那请问    Idle_  如何才能弹出输入法窗口呢
      

  3.   

    当获得输入焦点时调用ActivateKeyboardLayout激活你指定的输入法的键盘布局。
      

  4.   

    试试拦截 WM_IME_* 消息看看
      

  5.   

    你SPY下看能不能看到虚拟机焦点窗口的句柄,
    case WM_IME_SETCONTEXT:
      if (wParam)
      {
        hUIExtra = (HGLOBAL)GetWindowLong(hWnd,IMMGWL_PRIVATE);
       lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
       if (hUICurIMC)
      {
         lpIMC = ImmLockIMC(hUICurIMC);
         if (lpIMC)
        {
          MoveCandWindow(hWnd,lpUIExtra,lpIMC);
          MoveCompWindow(hWnd,lpUIExtra,lpIMC);
        }
       else
       {
        HideCandWindow(lpUIExtra);
        HideCompWindow(lpUIExtra);
        }
       ImmUnlockIMC(hUICurIMC);
    }
    else   // it is NULL input context.
    {
      HideCandWindow(lpUIExtra);
      HideCompWindow(lpUIExtra);
    }
    GlobalUnlock(hUIExtra);
    }
    break;
    上面是自由拼音输入法获取到上下文的处理,应该是你的上下文获取失败隐藏了输入窗口或是一开始输入窗口就创建失败。
      

  6.   

    话说你2#所说的内容
    拦截信息是拦截虚拟机的窗口?还是拦截虚拟机所运行的系统里面的窗口?
    至于你说的切换了中文输入法,是windows的桌面输入法还是虚拟机里面的输入法?一般虚拟机获得焦点后,焦点都会被转移到虚拟机内部的焦点窗口中
    所有的鼠标移动、点击、键盘的按键都会被转移到里面去
    至于你说的输入法没现实那个框框出来,有可能是安卓系统的输入消息处理不正常所导致的吧(例如你在windows桌面里切换了中文输入法,但是虚拟机里没有切换,所以虚拟机里照样是按照普通按键信息来处理。而安卓在没有输入法小键盘出来的时候是不可能处理按键消息的)