找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6339|回复: 8

VB向其他程序发送消息问题?help me!

[复制链接]

1

主题

12

回帖

0

精华

铜牌会员

积分
285
发表于 2008-11-27 00:45:38 | 显示全部楼层 |阅读模式
<p>刚发现这个好地方~~</p>
<p>咨询个问题。。。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>想做个VB小东西,向程序发送动作:</p>
<p>&nbsp;</p>
<p>动作是:打开缩小在任务栏的程序,并双击或者右键单击连接</p>
<p>程序如图:</p>
<p><img src="http://p13.freep.cn/p.aspx?u=v20_p13_p_0811270047124727_0.jpg"/></p>
[此贴子已经被作者于2008-11-27 0:47:57编辑过]

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2008-11-27 01:00:53 | 显示全部楼层
<p>还不睡啊.</p>
<p>&nbsp;</p>
<p>发点击消息倒是简单:</p>
<p>&nbsp;</p>
<p><font face="Verdana">CALL&nbsp;PostMessage(hwnd, WM_LBUTTONDBLCLK, 0, (mX And &amp;HFFFF) + (mY And &amp;HFFFF) * &amp;H10000)</font></p>
<p>&nbsp;</p>
<p>其中HWND是LISTVIEW控件的句柄,MX与MY是要点击的相对座标,单位为象素,LISTVIEW控件的左上角为0,0.</p>
我就是嗷嗷叫的老马了......

1

主题

12

回帖

0

精华

铜牌会员

积分
285
 楼主| 发表于 2008-11-27 01:28:21 | 显示全部楼层
<p>呵呵~~马哥一样啊。。夜猫子。。。</p>
<p>&nbsp;</p>
<p>我试试再睡~~</p>

1

主题

12

回帖

0

精华

铜牌会员

积分
285
 楼主| 发表于 2008-11-27 01:35:15 | 显示全部楼层
<p>第一次弄这个,麻烦马哥再指点下</p>
<p>用spy++查了...</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font face="Verdana"><img src="http://p13.freep.cn/p.aspx?u=v20_p13_p_0811270131384560_0.jpg"/></font></p>
<p>&nbsp;</p>
<p><img src="http://p11.freep.cn/p.aspx?u=v20_p11_p_0811270133539415_0.jpg"/></p>
<p><img src="http://p11.freep.cn/p.aspx?u=v20_p11_p_0811270205489220_0.jpg"/></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font face="Verdana">1~</font></p>
<p><font face="Verdana">CALL&nbsp;PostMessage(hwnd, WM_LBUTTONDBLCLK, 0, (mX And &amp;HFFFF) + (mY And &amp;HFFFF) * &amp;H10000)</font></p>
<p>&nbsp;</p>
<p>具体该如何呢?</p>
<p><font face="Verdana">2~PostMessage</font>的声明如下正确么?</p>
<p>&nbsp;</p>
<p><font face="Verdana">Private Declare Function PostMessage&amp; Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) as long</font></p>
<p>&nbsp;</p>
<p>3~HWND是LISTVIEW控件的句柄,用Spy++直接获得如上图,这个是句柄固定不变的么?</p>
<p>&nbsp;</p>
<p>4~MX与MY是要点击的相对座标,这个坐标如何取得呢?</p>
<p>&nbsp;</p>
[此贴子已经被作者于2008-11-27 2:06:41编辑过]

1

主题

12

回帖

0

精华

铜牌会员

积分
285
 楼主| 发表于 2008-11-27 01:56:11 | 显示全部楼层
<p><font face="Verdana">获得LISTVIEW控件的句柄为001802BA</font></p>
<p>&nbsp;</p>
<p>如下代码不能能发送成功:</p>
<p><font face="Verdana">Private Declare Function PostMessage&amp; Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)<br/>Private Sub Command1_Click()<br/>Dim xyz As Long<br/>xyz = 1573562<br/>Call PostMessage(xyz, WM_LBUTTONDBLCLK, 0, (20 And &amp;HFFFF) + (20 And &amp;HFFFF) * &amp;H10000)<br/>End Sub<br/></font></p>
[此贴子已经被作者于2008-11-27 2:07:31编辑过]

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2008-11-27 15:28:51 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder"><b><font face="Verdana">Option Explicit</font>
<p><font face="Verdana">Private Declare Function PostMessage&amp; Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)<br/>Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _<br/>&nbsp;&nbsp;&nbsp;&nbsp; ByVal lpClassName As String, _<br/>&nbsp;&nbsp;&nbsp;&nbsp; ByVal lpWindowName As String) As Long<br/>Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _<br/>&nbsp;&nbsp;&nbsp;&nbsp; ByVal hWnd1 As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp; ByVal hWnd2 As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp; ByVal lpsz1 As String, _<br/>&nbsp;&nbsp;&nbsp;&nbsp; ByVal lpsz2 As String) As Long<br/>Private Const WM_LBUTTONDBLCLK As Long = &amp;H203</font></p>
<p><font face="Verdana">Private Sub Command1_Click()<br/>&nbsp;&nbsp;&nbsp; Dim tWnd1 As Long, tWnd2 As Long<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; tWnd1 = FindWindow(vbNullString, "你程序的标题,iNode什么的")<br/>&nbsp;&nbsp;&nbsp; If tWnd1 = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "未找到iNode!", vbOKOnly Or vbInformation<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Sub<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; tWnd2 = FindWindowEx(tWnd1, ByVal 0&amp;, "SysListView32", vbNullString)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '只有一个SysListView32就可以这样做<br/>&nbsp;&nbsp;&nbsp; If tWnd2 = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "未找到SysListView32!", vbOKOnly Or vbInformation<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Sub<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Call PostMessage(tWnd2, WM_LBUTTONDBLCLK, 0, ByVal (187 And &amp;HFFFF) + (47 And &amp;HFFFF) * &amp;H10000)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '187,47,是从你那图里得到的,即鼠标当前坐标(515,353)减去SysListView32的左上角坐标(328,306)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '这是一个相对坐标.<br/>End Sub</font></b></p></div>
<p>&nbsp;</p>
<p>用这个代码试一下.</p>
<p>&nbsp;</p>
<p>句柄在每次对象建立时都是临时申请的,因此两次运行得到相同句柄的机率接近0.</p>
<p>&nbsp;</p>
<p>所以要使用窗体名+类名来定位你的SysListView32,然后再发送双击消息.</p>
<p>&nbsp;</p>
<p>以上代码仅是思路,具体需要你自己调试,但已经差不了多少了.</p>
我就是嗷嗷叫的老马了......

1

主题

12

回帖

0

精华

铜牌会员

积分
285
 楼主| 发表于 2008-11-27 23:52:54 | 显示全部楼层
<p>现在才有空来看了。。。谢[em50]</p>
<p>&nbsp;</p>
<p>按马哥上面给出的代码调试了,不知道原因,<font color="#ff0000">发送左键双击不成功。</font></p>
<p><font color="#ff0000">我在上面的代码后加入了</font></p>
<p><font face="Verdana">&nbsp;If PostMessage(tWnd2, WM_LBUTTONDBLCLK, 0, ByVal (39 And &amp;HFFFF) + (43 And &amp;HFFFF) * &amp;H10000) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "发消息失败!"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</font></p>
<p><font color="#ff0000">并没有提示失败,但发送的双击消息没有任何反应。。。</font></p>
<p>不过倒是明白了两个api的用法,<font face="Verdana">FindWindow</font>是找主窗体句柄,<font face="Verdana">FindWindowEx</font>是找类句柄的。</p>
<p>----------------------------------------------------------------------------</p>
<p>很疑惑一点:</p>
<p><font color="#ff0000">这个相对坐标不会变么</font>?窗口的位置不同,这个坐标不就变了,因为这个相对坐标是鼠标当前坐标减去SysListView32的左上角坐标得来的,这两个坐标都是会变的。</p>
<p>要是把iNode程序移动了,那消息不就发不出去了,这段Call PostMessage(tWnd2, WM_LBUTTONDBLCLK, 0, ByVal (187 And &amp;HFFFF) + (47 And &amp;HFFFF) * &amp;H10000)<br/>就没有通用性了。。。</p>
[此贴子已经被作者于2008-11-28 0:10:42编辑过]

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2008-11-30 19:40:39 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>hongkvip</i>在2008-11-27 23:52:54的发言:</b><br/>
<p>现在才有空来看了。。。谢<img title="dvubb" alt="图片点击可在新窗口打开查看" src="http://www.m5home.com/bbs/images/emot/em50.gif" onload="imgresize(this);" align="middle" border="0"/></p>
<p>&nbsp;</p>
<p>按马哥上面给出的代码调试了,不知道原因,<font color="#ff0000">发送左键双击不成功。</font></p>
<p><font color="#ff0000">我在上面的代码后加入了</font></p>
<p><font face="Verdana">&nbsp;If PostMessage(tWnd2, WM_LBUTTONDBLCLK, 0, ByVal (39 And &amp;HFFFF) + (43 And &amp;HFFFF) * &amp;H10000) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "发消息失败!"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</font></p>
<p><font color="#ff0000">并没有提示失败,但发送的双击消息没有任何反应。。。</font></p>
<p>不过倒是明白了两个api的用法,<font face="Verdana">FindWindow</font>是找主窗体句柄,<font face="Verdana">FindWindowEx</font>是找类句柄的。</p>
<p>----------------------------------------------------------------------------</p>
<p>很疑惑一点:</p>
<p><font color="#ff0000">这个相对坐标不会变么</font>?窗口的位置不同,这个坐标不就变了,因为这个相对坐标是鼠标当前坐标减去SysListView32的左上角坐标得来的,这两个坐标都是会变的。</p>
<p>要是把iNode程序移动了,那消息不就发不出去了,这段Call PostMessage(tWnd2, WM_LBUTTONDBLCLK, 0, ByVal (187 And &amp;HFFFF) + (47 And &amp;HFFFF) * &amp;H10000)<br/>就没有通用性了。。。</p>
<div align="right"><font color="#000066">[此贴子已经被作者于2008-11-28 0:10:42编辑过]</font></div></div>
<p>你是向LISTVIEW发送了点击消息,因此只要知道它的句柄即可.</p>
<p>&nbsp;</p>
<p>这种情况下,其内部相对坐标是不变的.</p>
<p>&nbsp;</p>
<p>就好比"用砖拍脑袋",被拍的人在哪里都没问题,因为我只需要找到脑袋,一砖拍上去就行.....</p>
<p>&nbsp;</p>
<p>至于不行的原因,你最好把你实际的相对坐标计算出来,看看我是如何计算出来的.</p>
<p>&nbsp;</p>
<p>这代码我是测试后才发上来的,只有坐标问题了.</p>
我就是嗷嗷叫的老马了......

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2008-11-30 23:43:20 | 显示全部楼层
<div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>tonycasablanca</i>在2008-11-30 10:53:21的发言:</b><br/>
<p>如何listview中有垂直滚动条,没有被直接显示的项目</p>
<p>&nbsp;</p>
<p>他们相对于屏幕的坐标又怎么计算呢</p></div>
<p>&nbsp;</p>
<p>未显示的就应该无法计算吧.....我不清楚 </p>
<p>&nbsp;</p>
<p>要想操作LV里未显示的项,可能还需要再深入研究一下</p>
<p>&nbsp;</p>
<p>毕竟项未显示,我们也无法直接操作,还不是得拉出来显示了才行!</p>
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表