我在这里找了一个源程序
http://www.codeproject.com/samples/onscreenkeyboard.asp
但是这个源程序是直接画的键盘,不知道怎么画,因此我希望使用按钮来实现键盘
我觉得那样有点击效果,看上去更自然和舒适。但是我试验了一下我的想法,结果却是
程序的焦点在我的程序和记事本之间不停切换,一点都不像那些输入法上的软键盘工作
自然和舒服,不知道我这个程序的问题出在哪里?
大家帮忙指点一下?
源程序我放在这里了。VC6.0+win2000环境http://www.olight.com.cn/temp/keyboarddemo.rar

解决方案 »

  1.   

    有人提到输入法的软键盘是 WS_DISABLED 的窗口,这样就没有焦点事件了。
    我看了一下 "紫光输入法" 的软键盘,类名 SoftKBDClsC1
    确实是WS_DISABLED的,但是这样又怎么使用这个窗体呢?
    还不明白。
      

  2.   

    我试验了把窗口改成 WS_DISABLED  
    结果现在点鼠标没有反应了。
      

  3.   

    就算把窗口改成 WS_DISABLED  ,当点击到改窗体上那么下面的那个窗体也失去了焦点我想可能需要后台监控程序监控鼠标,当移动到改窗体上,拦截鼠标的点击消息,自己再在该窗体上画图形成一个假相  【不晓得怎么做的,猜的,呵呵】
      

  4.   

    非常感谢icansaymyabc
    不过我后来又找到一个软键盘,我使用spy++查看,发下就是使用按钮实现的,应该是使用delphi实现的。是一个免费的软键盘,我在这里下载的:    http://www.lakefolks.org/cnt/如果您有兴趣,不妨下载来试验一下.
      

  5.   

    输入法有个特点,他的窗口作为一种特殊窗口,与接受输入的窗口是等同的,它就像是目标窗口中的一个部分一样,他们之间没有切换。如果你打开有标题栏的输入法你会看到,两个的标题栏都是亮的,不存在一灰一亮。做不到这一点的就不是输入法,做到了这一点,具体输入时随你怎么做都行。
    -----------------------------------------------------
    这一点是这么做的:响应WM_ACTIVATE消息,hParenWnd是目标窗口句柄:case WM_ACTIVATE:
             if(IsWindowEnabled(hWnd))
             {
             SendMessage(hParentWnd,WM_NCACTIVATE,TRUE,0);
        SendMessage(hWnd,WM_NCACTIVATE,TRUE,0);
             }
             break;但是这么做了有没有用我就不知道了,楼主可以试试。
      

  6.   

    需要说明一点,我不是想做输入法的程序,我只是想做一个软键盘的程序。再次感谢icansaymyabc和ringphone的关注
      

  7.   

    如果把ringphone提供的代码放到 PreTranslateMessage 中,那么倒是可以几乎不能看到标题栏的变换,只是从任务栏上可以看到变化。不过移动鼠标的时候,输入对象框就感觉有点闪了。         {
     ::SendMessage(gFocus,WM_NCACTIVATE,TRUE,0);
     ::SendMessage(m_hWnd,WM_NCACTIVATE,TRUE,0);
             }
      

  8.   

    问题已经解决了
    这要得益于这个帖http://search.csdn.net/Expert/topic/1346/1346485.xml?temp=.4596521增加上:对WM_MOUSEACTIVATE 和 WM_ACTIVATE 的消息处理就OK了。-----------------------老季同志,我很遗憾的告诉你,你的想法是不可行的,因为手写板跟WORD不是一个EXE,再经过测试OnSetFoucs()和OnKillFocus()也是不行的(我用的是对话框做的测试,根本就没有相应,有问题),试验还发现::SetFocus()也是不行的,要用::SetForegroundWindow();,至少以下代码是可行的,但是窗口句柄你要自己获得,而且这个效果只能说可以基本实现你想要的效果而已,不是最终的解决办法,其它的我也就不知道了,我水平有限,只能帮到这了。int CAbcDlg::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) 
    {
    MessageBeep(MB_OK);
    HWND   hwnd;
    int hw=0x000d039a;
    hwnd = (HWND)(hw);
    // hwnd = ::GetForegroundWindow();
    // hwnd = GetMyFocusWnd(); //这个函数返回你的那个窗口的句柄 ::SetForegroundWindow(hwnd);
    //::SetFocus( hwnd ); return MA_NOACTIVATE;
    //return CDialog::OnMouseActivate(pDesktopWnd, nHitTest, message);
    }void CAbcDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
    {
    //CDialog::OnActivate(nState, pWndOther, bMinimized); HWND   hwnd;
    int hw=0x000d039a;
    hwnd = (HWND)(hw); ::SetForegroundWindow(hwnd);
    }不过把自己设为WORD的一个子窗口也许是一个好办法,上面有人说过了。