如何判断当前窗口是否处于输入字符的状态?具体的说,怎样知道当前窗口中获得输入焦点的子窗口或控件是个文本框或具有输入字符功能的其它控件(如组合框等)?就象汉字输入法一样,当光标处于输入字符的窗体时,就自动显示出汉字输入窗口,当焦点处于某按钮或复选框等非字符输入窗口时,就自动隐藏输入法窗口。前几天我做了一个软键盘程序(是个普通应用程序,不是Ime),想实现象汉字输入法一样的自动显示和隐藏软键盘的功能,问题是怎样知道当前是否处于字符输入状态呢?

解决方案 »

  1.   

    你需要重载你的控件,当鼠标放在控件上的时候创建你希望出现的那个软件盘的窗口,当离开的时候销毁那个软件盘窗口
    具体代码【可能】如下,部分结构和函数名字实在记不住……在你希望它出现软键盘的控件类的OnMouseMove函数中加入
    TRACKMOUSEEVENT evtMouse;
    evtMouse.cbSize=sizeof(evtMouse);
    evtMouse.dwFlags=TME_HOVER | TME_LEAVE;
    evtMouse.dwHoverTime=1;
    evtMouse.hwndTrack=this->GetSafeHwnd();
    _TrackMouseEvent(&evtMouse);
    CCtrlWnd(控件类的名字)::OnMouseMove(nFlags, point);上面的代码将追踪鼠标的悬停或者离开事件然后重载DefWndProc函数
    LRESULT CCtrlWnd::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    // TODO: Add your specialized code here and/or call the base class
    switch(message)
    {
    case WM_MOUSELEAVE://鼠标移动出了窗口
                    //销毁软键盘窗口
    return 0;
    case WM_MOUSEHOVER://鼠标进入了窗口
    //创建并显示软键盘窗口
    return 0;
    }
    return CCtrlWnd::DefWindowProc(message, wParam, lParam);
    }
      

  2.   

    最后一个错了
    应该是return CCtrlWndParent::DefWindowProc(message, wParam, lParam);
    比如你如果重载了CEdit,就是
    return CEdit::DefWindowProc(message, wParam, lParam); 最后调用父类的DefWindowProc
      

  3.   

    用API GetGUIThreadInfo获取当前窗口所在线程的GUI信息,然后判断返回的GUITHREADINFO结构中的hwndCaret是否等于当前窗口的handle来判断当前窗口是否是个激活的输入框