VB向其他程序发送消息问题?help me!
<p>刚发现这个好地方~~</p><p>咨询个问题。。。</p>
<p> </p>
<p> </p>
<p>想做个VB小东西,向程序发送动作:</p>
<p> </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编辑过] <p>还不睡啊.</p>
<p> </p>
<p>发点击消息倒是简单:</p>
<p> </p>
<p><font face="Verdana">CALL PostMessage(hwnd, WM_LBUTTONDBLCLK, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000)</font></p>
<p> </p>
<p>其中HWND是LISTVIEW控件的句柄,MX与MY是要点击的相对座标,单位为象素,LISTVIEW控件的左上角为0,0.</p> <p>呵呵~~马哥一样啊。。夜猫子。。。</p>
<p> </p>
<p>我试试再睡~~</p> <p>第一次弄这个,麻烦马哥再指点下</p>
<p>用spy++查了...</p>
<p> </p>
<p> </p>
<p><font face="Verdana"><img src="http://p13.freep.cn/p.aspx?u=v20_p13_p_0811270131384560_0.jpg"/></font></p>
<p> </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> </p>
<p> </p>
<p><font face="Verdana">1~</font></p>
<p><font face="Verdana">CALL PostMessage(hwnd, WM_LBUTTONDBLCLK, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000)</font></p>
<p> </p>
<p>具体该如何呢?</p>
<p><font face="Verdana">2~PostMessage</font>的声明如下正确么?</p>
<p> </p>
<p><font face="Verdana">Private Declare Function PostMessage& Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) as long</font></p>
<p> </p>
<p>3~HWND是LISTVIEW控件的句柄,用Spy++直接获得如上图,这个是句柄固定不变的么?</p>
<p> </p>
<p>4~MX与MY是要点击的相对座标,这个坐标如何取得呢?</p>
<p> </p>
[此贴子已经被作者于2008-11-27 2:06:41编辑过] <p><font face="Verdana">获得LISTVIEW控件的句柄为001802BA</font></p>
<p> </p>
<p>如下代码不能能发送成功:</p>
<p><font face="Verdana">Private Declare Function PostMessage& 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 &HFFFF) + (20 And &HFFFF) * &H10000)<br/>End Sub<br/></font></p>
[此贴子已经被作者于2008-11-27 2:07:31编辑过] <div class="msgheader">QUOTE:</div><div class="msgborder"><b><font face="Verdana">Option Explicit</font>
<p><font face="Verdana">Private Declare Function PostMessage& 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/> ByVal lpClassName As String, _<br/> ByVal lpWindowName As String) As Long<br/>Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _<br/> ByVal hWnd1 As Long, _<br/> ByVal hWnd2 As Long, _<br/> ByVal lpsz1 As String, _<br/> ByVal lpsz2 As String) As Long<br/>Private Const WM_LBUTTONDBLCLK As Long = &H203</font></p>
<p><font face="Verdana">Private Sub Command1_Click()<br/> Dim tWnd1 As Long, tWnd2 As Long<br/> <br/> tWnd1 = FindWindow(vbNullString, "你程序的标题,iNode什么的")<br/> If tWnd1 = 0 Then<br/> MsgBox "未找到iNode!", vbOKOnly Or vbInformation<br/> Exit Sub<br/> End If<br/> tWnd2 = FindWindowEx(tWnd1, ByVal 0&, "SysListView32", vbNullString) '只有一个SysListView32就可以这样做<br/> If tWnd2 = 0 Then<br/> MsgBox "未找到SysListView32!", vbOKOnly Or vbInformation<br/> Exit Sub<br/> End If<br/> Call PostMessage(tWnd2, WM_LBUTTONDBLCLK, 0, ByVal (187 And &HFFFF) + (47 And &HFFFF) * &H10000)<br/> '187,47,是从你那图里得到的,即鼠标当前坐标(515,353)减去SysListView32的左上角坐标(328,306)<br/> '这是一个相对坐标.<br/>End Sub</font></b></p></div>
<p> </p>
<p>用这个代码试一下.</p>
<p> </p>
<p>句柄在每次对象建立时都是临时申请的,因此两次运行得到相同句柄的机率接近0.</p>
<p> </p>
<p>所以要使用窗体名+类名来定位你的SysListView32,然后再发送双击消息.</p>
<p> </p>
<p>以上代码仅是思路,具体需要你自己调试,但已经差不了多少了.</p> <p>现在才有空来看了。。。谢</p>
<p> </p>
<p>按马哥上面给出的代码调试了,不知道原因,<font color="#ff0000">发送左键双击不成功。</font></p>
<p><font color="#ff0000">我在上面的代码后加入了</font></p>
<p><font face="Verdana"> If PostMessage(tWnd2, WM_LBUTTONDBLCLK, 0, ByVal (39 And &HFFFF) + (43 And &HFFFF) * &H10000) = 0 Then<br/> MsgBox "发消息失败!"<br/> 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 &HFFFF) + (47 And &HFFFF) * &H10000)<br/>就没有通用性了。。。</p>
[此贴子已经被作者于2008-11-28 0:10:42编辑过] <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> </p>
<p>按马哥上面给出的代码调试了,不知道原因,<font color="#ff0000">发送左键双击不成功。</font></p>
<p><font color="#ff0000">我在上面的代码后加入了</font></p>
<p><font face="Verdana"> If PostMessage(tWnd2, WM_LBUTTONDBLCLK, 0, ByVal (39 And &HFFFF) + (43 And &HFFFF) * &H10000) = 0 Then<br/> MsgBox "发消息失败!"<br/> 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 &HFFFF) + (47 And &HFFFF) * &H10000)<br/>就没有通用性了。。。</p>
<div align="right"><font color="#000066">[此贴子已经被作者于2008-11-28 0:10:42编辑过]</font></div></div>
<p>你是向LISTVIEW发送了点击消息,因此只要知道它的句柄即可.</p>
<p> </p>
<p>这种情况下,其内部相对坐标是不变的.</p>
<p> </p>
<p>就好比"用砖拍脑袋",被拍的人在哪里都没问题,因为我只需要找到脑袋,一砖拍上去就行.....</p>
<p> </p>
<p>至于不行的原因,你最好把你实际的相对坐标计算出来,看看我是如何计算出来的.</p>
<p> </p>
<p>这代码我是测试后才发上来的,只有坐标问题了.</p> <div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>tonycasablanca</i>在2008-11-30 10:53:21的发言:</b><br/>
<p>如何listview中有垂直滚动条,没有被直接显示的项目</p>
<p> </p>
<p>他们相对于屏幕的坐标又怎么计算呢</p></div>
<p> </p>
<p>未显示的就应该无法计算吧.....我不清楚 </p>
<p> </p>
<p>要想操作LV里未显示的项,可能还需要再深入研究一下</p>
<p> </p>
<p>毕竟项未显示,我们也无法直接操作,还不是得拉出来显示了才行!</p>
页:
[1]