我写了一个软键盘,想实现这样的功能,软键盘已被运行,当编辑框获得焦点时,软键盘弹出,当编辑框失去焦点时,软键盘隐藏起来,重载了编辑框的类,分别重载了OnSetFocus和OnKillFocus,可结果时当软键盘弹出时,编辑框就失去了焦点,于是执行OnKillFocus,软键盘被隐藏起来了,然后编辑框就又获得了焦点,于是就这样循环,软键盘就弹出隐藏弹出隐藏,不停的这样做,请问大家有什么好的建议来实现这个功能:当编辑框获得焦点时,软键盘弹出,当编辑框失去焦点时,软键盘隐藏起来

解决方案 »

  1.   

    ce API函数SipShowIM可以实现这个功能,可我找不到这个函数的源码,谁有能共享一下吗
      

  2.   

    软键盘弹出我是用下面代码实现的:
    CWnd*   pWnd=CWnd::FindWindow(NULL,_T("Keyboard"));  
    HWND   hwnd=pWnd->GetSafeHwnd();
    //::PostMessage(hwnd,WM_CLOSE,0,0);
    ::SendMessage(hwnd,WM_SHOWWINDOW,SW_SHOW,SW_SHOW);
    在软键盘程序里重载了OnShowWindow。
    软键盘一弹出来编辑框焦点就失去了。
      

  3.   

    建议使用
    SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVE | SWP_SHOWWINDOW) ;
    来显示软键盘窗口。
      

  4.   

    我知道了为什么一点击软键盘就消失了,因为我再OnKillFocus里把软键盘隐藏了。我想我的软键盘写的有点问题,当点击软键盘时,编辑框就暂时失去焦点,可是该怎么做才能使编辑框一直有焦点呢。我的程序是wince下的
      

  5.   

    两个办法:
    1. 编辑框判断失去焦点时,获得焦点的窗口如果是你的软键盘窗口,则不隐藏软键盘,否则隐藏;
    这个方法不好。2. 在软键盘的WM_MOUSEACTIVATE消息响应函数中,返回MA_NOACTIVATE,即不让鼠标激活当前这个窗口。
    这个方法专业。
      

  6.   

    可是我没找到WM_MOUSEACTIVATE这个消息啊
      

  7.   

    可能是CE下没有这个消息,你可以利用WM_ACTIVATE这个消息。不过在MSDN的CE部分关于WM_ACTIVATE的说明中提到了WM_MOUSEACTIVATE消息,为什么你会找不到?
      

  8.   

    WM_MOUSEACTIVATE,是不是要用到钩子呢
      

  9.   

    你说的编辑框是指哪里的编辑框啊?任意应用程序的编辑框么?还是你自己应用程序的.
    如果是前者一定要用hook了,后者此不必
      

  10.   

    让你们见笑了。WM_MOUSEACTIVATE ce下没有这个消息。
      

  11.   

    晕死,10楼的时候不是跟你说了可以用WM_ACTIVATE消息?
      

  12.   

    我自己添加了WM_ACTIVATE消息的处理函数,可是没有响应
      

  13.   

    知道如何正确的添加WM_ACTIVEATE消息了,可当这个函数响应时,窗口已经高亮了,说明窗口已经被激活了。那我应该怎么做才能实现这样的功能:当鼠标点击它,它可以相应鼠标的活动,但它应该是一直处于非激活状态。