VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 4534|回复: 9

单击按钮就向外部程序窗口发送一个键,语句怎么写?

[复制链接]
 楼主| 发表于 2005-10-17 16:28:58 | 显示全部楼层
我正在制作一个形如Windows屏幕键盘的软键盘,碰到难题了。<br />在VB中,如果在本窗体中添加文本框等控件,再将本窗口中按钮点击后产生一个键发送到文本框里并不难,但我想发送到另外一个窗口中的文本框里可就难了。<br />我想,肯定要用API函数,但怎么使用,请高手指点。<br />以下是我试用的代码,但效果不理想:<br />(窗体里有一个按钮Command1,和一个时钟Time1)<br />rivate Declare Function GetForegroundWindow Lib &quot;user32&quot; () As Long<br />rivate Declare Function SetForegroundWindow Lib &quot;user32&quot; (ByVal hwnd As Long) As Long<br />rivate Declare Sub keybd_event Lib &quot;user32&quot; (ByVal bVk As Byte, ByVal bScan As Byte, _ <br />ByVal dwFlags As Long, ByVal dwExtraInfo As Long)<br />Dim s1, s2 As Long<br />Private Sub Timer1_Timer()<br />    s1 = GetForegroundWindow<br />    If s1 &lt;&gt; Me.hwnd Then s2 = s1<br />End Sub<br />Private Sub Command1_Click()<br />    SetForegroundWindow s2<br />    keybd_event 90, 0, 0, 0<br />End Sub<br /><br />我将完整的我制作的软键盘源代码也发送上来,请高手指点:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-18 15:47:42 | 显示全部楼层
怎么我上传不了附件呢?
回复 支持 反对

使用道具 举报

发表于 2005-10-19 12:09:56 | 显示全部楼层
<br />同一工程里的两窗口之间直接写数就可以<br />sub command1_click()<br />    form2.text1.text=键值<br />end sub<br /><br />不同工程间利用Winsock通信。很容易传递你的值。<br />设置WINSOCK为UDP模式。<br />代码我就不给你详细写了。比较简单,自己稍微写点就OK了。没你上边说的那么复杂。<br /><br />仅供参考
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-20 07:47:53 | 显示全部楼层
谢谢你,VB后来者。<br />很不好意思,我用的API代码都是从网上东拼点西凑点,真正的意思我仍没完全理解,VB我是刚刚准备入门。<br />还得请教你WinScok具体的代码。<br /><br />比如,后来,我又将代码改成了转移输入焦点、禁止自身窗体接收焦点的形式,就是下面这样:<br />Rem 转移输入焦点的声明<br />rivate Declare Function GetWindowLong Lib &quot;user32&quot; Alias &quot;GetWindowLongA&quot; (ByVal hwnd As Long, ByVal nIndex As Long) As Long<br />rivate Declare Function SetWindowLong Lib &quot;user32&quot; Alias &quot;SetWindowLongA&quot; (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long<br /><br />Rem 窗口置顶的声明<br />rivate Declare Function SetWindowPos Lib &quot;user32&quot; (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long<br /><br />Rem 转移输入焦点的常数<br />Private Const HWND_NOTOPMOST = -2<br />Private Const WS_DISABLED = &amp;H8000000<br />Private Const GWL_EXSTYLE = (-20)<br />Private Const GWL_STYLE = (-16)<br /><br />Rem 窗口置顶的常数<br />Private Const HWND_TOPMOST = -1<br />Private Const SWP_NOACTIVATE = &amp;H10<br />Private Const SWP_NOMOVE = &amp;H2<br />Private Const SWP_NOSIZE = &amp;H1<br />Private Const SWP_SHOWWINDOW = &amp;H40<br /><br />Rem 窗体调用时,转移输入焦点,且置顶<br />Private Sub Form_Load()<br />    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE<br />    Dim style As Long<br />    style = GetWindowLong(Me.hwnd, GWL_EXSTYLE)<br />    style = style Or WS_DISABLED<br />    Call SetWindowLong(Me.hwnd, GWL_EXSTYLE, style)<br />End Sub<br /><br /><br />用这段代码处理了之后,在XP等版本中几乎可以乱真,但我迫切的希望它能在98下运行,就是不行。
回复 支持 反对

使用道具 举报

发表于 2005-10-20 08:47:38 | 显示全部楼层
你是不是用到了98不支持的API?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-20 10:59:07 | 显示全部楼层
就是加了个常数<br />Const WS_DISABLED = &amp;H8000000<br /><br />用来禁止窗口的使能<br />按说,98对这个API也支持喽。<br />
回复 支持 反对

使用道具 举报

发表于 2005-10-24 02:48:54 | 显示全部楼层
findwindow<br />findchildwindows<br />找到那控件hwnd<br />postmessage hwnd,wm_keydown,keycode键,0
回复 支持 反对

使用道具 举报

发表于 2005-10-24 08:35:40 | 显示全部楼层
找到句柄,然后用postmessage <br />
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-24 09:43:33 | 显示全部楼层
谢谢楼上二位。 <br />但这样好象仍是每个键PostMessage一次哦,能不能让它按键时不闪烁呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-1 17:54:00 | 显示全部楼层
后来写好了。
做个记号,在这两个帖子里:
http://www.vbgood.com/thread-57482-1-1.html
http://www.vbgood.com/thread-25039-1-1.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-5 11:44

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表