Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5972|回复: 12

[已解决]如何用VBA模拟点击另外一个程序的按钮?

[复制链接]
发表于 2014-5-8 09:48 | 显示全部楼层 |阅读模式
大家好 !  最近需要实现在Excel VBA中用代码模拟点击另外一个程序的按钮(Run)。

其中按钮的句柄已经得到了,但是使用SendMessage方法并没有实现点击按钮的效果(没有生成对应的文件)
以下是相关代码片段:

'声明API接口。
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal WMSG As Long, ByVal wParam As Long, ByVal lParam As Any) As Long

'函数中对应代码。
Dim FWnd As Long, BWnd As Long

FWnd = FindWindow(vbNullString, amosWinName)
BWnd = FindWindowEx(FWnd, 0, vbNullString, amosBtnName)
Call SendMessage(BWnd, &H202B, &H8061C, &H12E900)
Call SendMessage(BWnd, &H202B, &H8061C, &H12DBF4)
Call SendMessage(BWnd, &H202B, &H8061C, &H12D7FC)

整个函数运行没有报错,就是没有实现点击按钮生成文件的效果。

另附上通过Spy++检测手动点击按钮的相关过程:

<00001> 0008061C S WM_NCHITTEST xPos:1155 yPos:664
<00002> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00003> 0008061C S WM_NCHITTEST xPos:1157 yPos:665
<00004> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00005> 0008061C S WM_NCHITTEST xPos:1157 yPos:665
<00006> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00007> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00008> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00009> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:12 yPos:2
<00010> 0008061C S message:0xC245 [已注册:"WinFormsMouseEnter"] wParam:00000000 lParam:00000000
<00011> 0008061C R message:0xC245 [已注册:"WinFormsMouseEnter"] lResult:00000000
<00012> 0008061C P WM_PAINT hdc:00000000
<00013> 0008061C S WM_NCHITTEST xPos:1159 yPos:667
<00014> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00015> 0008061C S WM_NCHITTEST xPos:1162 yPos:668
<00016> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00017> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00018> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00019> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:17 yPos:5
<00020> 0008061C S WM_NCHITTEST xPos:1164 yPos:670
<00021> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00022> 0008061C S WM_NCHITTEST xPos:1166 yPos:670
<00023> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00024> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00025> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00026> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:21 yPos:7
<00027> 0008061C S WM_NCHITTEST xPos:1171 yPos:673
<00028> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00029> 0008061C S WM_NCHITTEST xPos:1171 yPos:673
<00030> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00031> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00032> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00033> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:26 yPos:10
<00034> 0008061C S WM_NCHITTEST xPos:1172 yPos:674
<00035> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00036> 0008061C S WM_NCHITTEST xPos:1173 yPos:675
<00037> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00038> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00039> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00040> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:28 yPos:12
<00041> 0008061C S WM_NCHITTEST xPos:1173 yPos:675
<00042> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00043> 0008061C S WM_NCHITTEST xPos:1177 yPos:677
<00044> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00045> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00046> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00047> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:32 yPos:14
<00048> 0008061C S WM_NCHITTEST xPos:1178 yPos:677
<00049> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00050> 0008061C S WM_NCHITTEST xPos:1179 yPos:678
<00051> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00052> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00053> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00054> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:34 yPos:15
<00055> 0008061C S WM_NCHITTEST xPos:1180 yPos:679
<00056> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00057> 0008061C S WM_NCHITTEST xPos:1180 yPos:679
<00058> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00059> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00060> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00061> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:35 yPos:16
<00062> 0008061C P message:0x0118 [未知] wParam:0000FFFA lParam:BF80A5FB
<00063> 0008061C P WM_MOUSEHOVER
<00064> 0008061C S WM_NCHITTEST xPos:1180 yPos:679
<00065> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00066> 0008061C S WM_NCHITTEST xPos:1180 yPos:679
<00067> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00068> 0008061C S WM_MOUSEACTIVATE hwndTopLevel:0005066E nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<00069> 0008061C R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
<00070> 0008061C S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
<00071> 0008061C S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
<00072> 0008061C R WM_IME_NOTIFY
<00073> 0008061C R WM_IME_SETCONTEXT
<00074> 0008061C S WM_SETFOCUS hwndLoseFocusnull)
<00075> 0008061C S message:0x202B [用户定义:WM_USER+7211] wParam:0008061C lParam:0012E900
<00076> 0008061C R message:0x202B [用户定义:WM_USER+7211] lResult:00000000
<00077> 0008061C R WM_SETFOCUS
<00078> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
<00079> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00080> 0008061C P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:35 yPos:16
<00081> 0008061C P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:35 yPos:16
<00082> 0008061C P WM_PAINT hdc:00000000
<00083> 0008061C P WM_LBUTTONUP fwKeys:0000 xPos:35 yPos:16
<00084> 0008061C S WM_PAINT hdc:00000000
<00085> 0008061C R WM_PAINT
<00086> 0008061C S WM_NCHITTEST xPos:1180 yPos:679
<00087> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00088> 0008061C S WM_KILLFOCUS hwndGetFocus:00460542
<00089> 0008061C S message:0x202B [用户定义:WM_USER+7211] wParam:0008061C lParam:0012DBF4
<00090> 0008061C R message:0x202B [用户定义:WM_USER+7211] lResult:00000000
<00091> 0008061C S WM_CAPTURECHANGED hwndNewCapture:00000000
<00092> 0008061C R WM_CAPTURECHANGED
<00093> 0008061C R WM_KILLFOCUS
<00094> 0008061C S WM_IME_SETCONTEXT fSet:0 iShow:C000000F
<00095> 0008061C R WM_IME_SETCONTEXT
<00096> 0008061C S WM_IME_NOTIFY dwCommand:IMN_CLOSESTATUSWINDOW dwCommand:00000001 dwData:00000000
<00097> 0008061C R WM_IME_NOTIFY
<00098> 0008061C P WM_PAINT hdc:00000000
<00099> 0008061C P WM_MOUSELEAVE
<00100> 0008061C P WM_PAINT hdc:00000000
<00101> 0008061C S WM_NCPAINT hrgn:00000001
<00102> 0008061C R WM_NCPAINT
<00103> 0008061C S WM_ERASEBKGND hdc:43011D0F
<00104> 0008061C R WM_ERASEBKGND fErased:True
<00105> 0008061C S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
<00106> 0008061C S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
<00107> 0008061C R WM_IME_NOTIFY
<00108> 0008061C R WM_IME_SETCONTEXT
<00109> 0008061C S WM_SETFOCUS hwndLoseFocus:00460542
<00110> 0008061C S message:0x202B [用户定义:WM_USER+7211] wParam:0008061C lParam:0012D7FC
<00111> 0008061C R message:0x202B [用户定义:WM_USER+7211] lResult:00000000
<00112> 0008061C R WM_SETFOCUS
<00113> 0008061C S WM_NCHITTEST xPos:1180 yPos:679
<00114> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00115> 0008061C S WM_NCHITTEST xPos:1180 yPos:679
<00116> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00117> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00118> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00119> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:35 yPos:16
<00120> 0008061C S message:0xC245 [已注册:"WinFormsMouseEnter"] wParam:00000000 lParam:00000000
<00121> 0008061C R message:0xC245 [已注册:"WinFormsMouseEnter"] lResult:00000000
<00122> 0008061C P WM_PAINT hdc:00000000
<00123> 0008061C P message:0x0118 [未知] wParam:0000FFFA lParam:BF80A5FB
<00124> 0008061C P WM_MOUSEHOVER
<00125> 0008061C S WM_NCHITTEST xPos:1179 yPos:679
<00126> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00127> 0008061C S WM_NCHITTEST xPos:1179 yPos:679
<00128> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00129> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00130> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00131> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:34 yPos:16
<00132> 0008061C S WM_NCHITTEST xPos:1178 yPos:680
<00133> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00134> 0008061C S WM_NCHITTEST xPos:1175 yPos:681
<00135> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00136> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00137> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00138> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:30 yPos:18
<00139> 0008061C S WM_NCHITTEST xPos:1171 yPos:682
<00140> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00141> 0008061C S WM_NCHITTEST xPos:1165 yPos:684
<00142> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00143> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00144> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00145> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:20 yPos:21
<00146> 0008061C S WM_NCHITTEST xPos:1153 yPos:689
<00147> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00148> 0008061C S WM_NCHITTEST xPos:1153 yPos:689
<00149> 0008061C R WM_NCHITTEST nHittest:HTCLIENT
<00150> 0008061C S WM_SETCURSOR hwnd:0008061C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00151> 0008061C R WM_SETCURSOR fHaltProcessing:False
<00152> 0008061C P WM_MOUSEMOVE fwKeys:0000 xPos:8 yPos:26
<00153> 0008061C P WM_MOUSELEAVE
<00154> 0008061C P WM_PAINT hdc:00000000
<00155> 0008061C S WM_KILLFOCUS hwndGetFocusnull)
<00156> 0008061C S WM_IME_NOTIFY dwCommand:IMN_SETOPENSTATUS dwCommand:00000008 dwData:00000000
<00157> 0008061C R WM_IME_NOTIFY
<00158> 0008061C S WM_IME_NOTIFY dwCommand:IMN_SETOPENSTATUS dwCommand:00000008 dwData:00000000
<00159> 0008061C R WM_IME_NOTIFY
<00160> 0008061C S message:0x202B [用户定义:WM_USER+7211] wParam:0008061C lParam:0012EB9C
<00161> 0008061C R message:0x202B [用户定义:WM_USER+7211] lResult:00000000
<00162> 0008061C R WM_KILLFOCUS
<00163> 0008061C S WM_IME_SETCONTEXT fSet:0 iShow:C000000F
<00164> 0008061C S WM_IME_NOTIFY dwCommand:IMN_CLOSESTATUSWINDOW dwCommand:00000001 dwData:00000000
<00165> 0008061C R WM_IME_NOTIFY
<00166> 0008061C R WM_IME_SETCONTEXT
<00167> 0008061C P WM_PAINT hdc:00000000


麻烦高人看看问题出在什么地方?谢谢!


最佳答案
2014-5-8 10:18
用WM_CLICK吧,这个更简单,后面2个参数直接传0.
发表于 2014-5-8 09:53 | 显示全部楼层
回复

使用道具 举报

发表于 2014-5-8 10:16 | 显示全部楼层
你发送的是消息是WM_LBUTTONUP,试试WM_LBUTTONDOWN,201
另外,我刚监视下WM_LBUTTONDOWN,有参数要传坐标呢。
回复

使用道具 举报

发表于 2014-5-8 10:18 | 显示全部楼层
WM_LBUTTONDOWN
http://baike.baidu.com/link?url=rMNr_CWYFRCIF-
r4CVYkl9O0tnvhlJEVI2j9gJJtLo97LMsMRuJqF97YzKobFAPX7i7NtmDE3i1FsYO7kkTF5_
回复

使用道具 举报

发表于 2014-5-8 10:18 | 显示全部楼层    本楼为最佳答案   
用WM_CLICK吧,这个更简单,后面2个参数直接传0.
回复

使用道具 举报

 楼主| 发表于 2014-5-8 10:37 | 显示全部楼层
hwc2ycy 发表于 2014-5-8 10:18
用WM_CLICK吧,这个更简单,后面2个参数直接传0.

谢谢你,我还想问一下WM_CLICK这个对应值如何查找呢?是不是每台机器上的值都不一样?
回复

使用道具 举报

发表于 2014-5-8 10:41 | 显示全部楼层
http://blog.sina.com.cn/s/blog_6129a8580100eeaz.html
看看这个,只要有按钮的句柄,貌似很容易了。
回复

使用道具 举报

 楼主| 发表于 2014-5-8 10:46 | 显示全部楼层
hwc2ycy 发表于 2014-5-8 10:41
http://blog.sina.com.cn/s/blog_6129a8580100eeaz.html
看看这个,只要有按钮的句柄,貌似很容易了。

谢谢版主。我已经试验成功了。我还是想确认下,WM_CLICK这种定义值是固定的吗?还是不同的机器可能不同,或者说是不同的操作系统会有不同?

回复

使用道具 举报

发表于 2014-5-8 10:47 | 显示全部楼层
貌似你的消息第2个参数多加了一个B。
  1. FWnd = FindWindow(vbNullString, amosWinName)
  2. BWnd = FindWindowEx(FWnd, 0, vbNullString, amosBtnName)
  3. Call SendMessage(BWnd, &HF5, 0, 0)
复制代码
如果不行你再试试先发送一个LBUTTONDOWN,再发一个LBUTTONUP的消息。
回复

使用道具 举报

发表于 2014-5-8 10:49 | 显示全部楼层
消息值一般是固定的。
这是系统约定好的。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 02:33 , Processed in 0.366894 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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