请教如何实现中文输入法中的SOFT KEYBOARD(100分)

  • 主题发起人 主题发起人 teddy
  • 开始时间 开始时间
T

teddy

Unregistered / Unconfirmed
GUEST, unregistred user!
在中文输入法中, 可以弹出一个虚拟键盘, 你可以用鼠标在上面点击各个BUTTON,而主窗口并不失去FOCUS, 也不会被DEACTIVATE.<br><br>正常情况下如果你点击一个非ACTIVE的窗口, 它将收到WM_MOUSEACTIVATE. 如果我的返回值为NOMOUSEACTIVATE, 该窗口将不会被ACTIVATE. 但以前的ACTIVE窗口却仍然收到一个消息WM_ACTIVATEAPP (WPARAM=DEACTIVATE)而失去FOCUS. 例如在资源管理器中修改文件名, 当其失去键盘焦点后, 改名的操作将被取消, 导致改名失败. 而在中文输入法中却没有这个问题.<br><br>请问是什么原理可以做到中文输入法中虚拟键盘的效果. 我在网上下载了一个SOFT_KEYBOARD的例子, 但没有原码, 也联系不到该软件的作者(据说软件的作者曾有一个个人主页叫飞鸣软件工作室, 软件用DELPHI写的). 有兴趣者可以下载:www.nease.net/~chang/SOFT_KBD.EXE<br><br>希望得到指点. 谢谢
 
请您注意换行
 
你自己作个工具条,按钮用Timage模拟(它没有焦点,因为继承自<br>TGraphicControl,没窗口句柄)
 
1. 这是个toolwindow.<br>2. 截获WM_ACTIVATE消息. <br>if Message.wparamlo = WA_CLICKACTIVE then<br>&nbsp; setactivewindow(message.lparam);<br>可以让你的toolwindow active时马上返回原来active的窗口.
 
不过, 如果是这样, 还要设wm_ncactivate吧? 让主窗口的form不为deactive??<br>
 
:cytown---<br>我看不用也可以了,我试过了,嘻嘻!
 
在ADVANCED WINDOWS这本书中有第10章(窗口消息和异步输入)介绍了一个方法,<br>用函数AttachThreadInput将soft-keyboard(软键盘)的消息输入队列附在当前<br>Active窗口。这样,当你点击软键盘时,原来的Active窗口并不会被De-active.<br><br>我建立了一个AlwaysOnTop的窗口A,用一个CBT-HOOK来捕捉Active窗口的变化。<br>每当有窗口焦点变化,我就将窗口A的线程输入队列用ATTACHTHREADINPUT附在<br>ACTIVE的窗口上,也解决了我自己提出的难题。<br><br>谢谢各位的支持
 
teddy:<br>&nbsp; &nbsp;怎样知道软键盘的ID?ACTIVE的窗口的ID?我就知道一个GetCurrentThreadId()?<br>能实现吗?
 
你可以用软键盘上的mousemove、mousedown及click事件!<br>在下面这个消息内执行mousedown或onclick事件:<br>&nbsp; if Message.wparamlo = WA_CLICKACTIVE then<br>&nbsp; begin<br>&nbsp; &nbsp; setactivewindow(message.lparam);<br>&nbsp; &nbsp; //mousedown(sender);或onclick(sender);<br>&nbsp; end;<br><br>&nbsp; ....mousedown(sener: Tobject);<br>&nbsp; begin<br>&nbsp; &nbsp; //你要执行的事件<br>&nbsp; end;<br><br>&nbsp; ....onclick(sender: Tobject);]<br>&nbsp; begin<br>&nbsp; &nbsp; //你要执行的事件<br>&nbsp; end;<br><br>
 
你不用去键盘的各键的ID的,可以通过KEYBD_EVENT函数来实现模拟键盘!
 
多人接受答案了。
 
后退
顶部