注册 登录
编程论坛 VB6论坛

如何实现vb 模拟鼠标点击其他应用程序内的命令按键

yjz2022 发布于 2022-05-16 10:10, 6090 次点击
我们的设备需要和一台老的设备联机工作,老设备没有技术支持,我需要在老设备的电脑上装一个软件(用VB做),需要该软件能实现按老设备软件上的一些按键的功能,用以下的代码(把以下代码复制到VB的一个窗体内,并建两个命令按键和两个文本控件)给text1和text2中填数据可以模拟鼠标移动到屏幕任何位置(包括老设备软件按键的位置),但只能移动到该位置不能实现按下按键的功能,不过如果改text1和text2的数值到下述command2的位置(vb程序窗口内的按键)就可以,也就是只能模拟按下自己的按键,不能其他应用内的按键,求大师指点,非常感谢。


Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4

Private sub command1
SetCursorPos Val(Text1.Text), Val(Text2.Text)
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
end sub
Private sub command2
msgbox"模拟鼠标按键"
end sub



[此贴子已经被作者于2022-5-16 10:12编辑过]

37 回复
#2
风吹过b2022-05-16 10:15
这种的,你为啥不用按键精灵做。

按键精灵脚本是 VBA ,会用VB,操作VBA 也一般没啥问题,稍注意一点就可以了。
#3
yjz20222022-05-16 10:19
回复 2楼 风吹过b
不知道怎么弄,您能说的再详细点不,有没有参考代码给我参考下,谢谢!
#4
风吹过b2022-05-16 10:36
你开一个按键精灵,用它的 录制功能 录制一个操作,然后看它的脚本代码就能明白。
控制命令 与 VB6 的一样。 都 是  FOR 啊,DO 这些。

#5
yjz20222022-05-16 10:38
回复 楼主 yjz2022
网上都说按我上面的代码就能实现,为什么我测试就只能再VB的应用内实现,离开VB到其他应用就不行。
#6
yjz20222022-05-16 10:41
回复 4楼 风吹过b
我的软件里还要用串口,图像比对等其他功能,所以要把模拟按键的功能植入到我的工程里才可以
#7
yjz20222022-05-16 10:44
回复 4楼 风吹过b
我大概明白你的意思了,你是说用按键精灵录制,就可以间接得到VB源码,然后再植入到我的工程里,是这样吗?谢谢!
#8
yjz20222022-05-16 11:08
回复 7楼 yjz2022
Private Sub Command4_Click()
MoveTo 971, 429
MoveTo 115, 128
Delay 15350
LeftDoubleClick 1
MoveTo 955, 557
Delay 10474
LeftClick 1
End Sub

这个是录制了一个鼠标点击的操作,在VB里无法运行,MoveTo函数没有定义,有这个API吗?
#9
风吹过b2022-05-16 11:19
如果你要用到串口,那就没办法用按键精灵了。那就老老实实用VB6了。

无法实现点击,要查 API 函数说明。
#10
yjz20222022-05-16 11:32
回复 9楼 风吹过b
您是高手,帮忙看下有没有其他办法,谢谢!
#11
jklqwe1112022-05-16 15:15
SetCursorPos是设置光标而不是鼠标。
使用mouse_event 移动鼠标到指定位置。
以下代码供参考:
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4
Private Const MOUSEEVENTF_MOVE =1 '移动鼠标标志
Private Const MOUSEEVENTF_ABSOLUTE =32768 '使用绝对坐标
Private sub command1
mouse_event MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE ,Val(Text1.Text), Val(Text2.Text),0,0

mouse_event MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP , 0, 0, 0, 0

end sub
Private sub command2
msgbox"模拟鼠标按键"
end sub
#12
yjz20222022-05-16 16:09
以下代码应该可以,可是如何获得要控制窗体及窗体按键的标题?


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
'鼠标按下
Const WM_LBUTTONDOWN = &H201
'鼠标弹出
Const WM_LBUTTONUP = &H202
'鼠标双击
Const WM_COMMAND = &H203
 
Private Sub Command1_Click()
Dim lngHWnd1 As Long, lngHWnd2 As Long
 
lngHWnd1 = FindWindow(vbNullString, "你要控制窗体的标题")
  If lngHWnd1 <> 0 Then
  lngHWnd2 = FindWindowEx(lngHWnd1, 0, vbNullString, "里面窗体或控件的标题")
   
  If lngHWnd2 <> 0 Then
  SendMessage lngHWnd2, WM_LBUTTONDOWN, 0&, 0&
  SendMessage lngHWnd2, WM_LBUTTONUP, 0&, 0&
   
  End If
  Else
  lngHWnd2 = 0
  End If
End Sub
#13
wds12022-05-16 16:44
只有本站会员才能查看附件,请 登录

1、可以获取屏幕鼠标位置
2、可以点击设置位置的鼠标
3、源程序

Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Private Type POINTAPI
 x As Long
 y As Long
End Type

'启动获得坐标定时器
Private Sub Command1_Click()
  If Command1.Caption = "获取屏幕坐标" Then
    Timer1.Interval = 200
    Command1.Caption = "F12停止获取"
  End If
End Sub
'设置鼠标位置并点击
Private Sub Command2_Click()
  SetCursorPos Val(Text1.Text), Val(Text2.Text)                      '设置鼠标位置
  mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 '点击坐标位置鼠标
  DoEvents
End Sub
'获得鼠标位置和键盘输入
Private Sub Timer1_Timer()
  Dim P As POINTAPI
  GetCursorPos P    '取的鼠标位置
  Text1.Text = P.x
  Text2.Text = P.y
  KeyResult = GetAsyncKeyState(123) '取的F12
  If KeyResult = -32767 Then
    Timer1.Interval = 0
    Command1.Caption = "获取屏幕坐标"
  End If
End Sub
#14
kings123332022-05-21 20:20
回复 4楼 风吹过b
版主,请教一个问题:VB如何实现对第三方界面的Botton按钮实现用 控件的"相对坐标"实现后台点击,
网上没看到相关案例;一般模拟鼠标需要将界面置前,鼠标再移到按钮那里API实现点击;
因为针对toolbar控件无法找到子按钮的句柄,所以我的想法是想找到窗体,再找到toolbar控件在窗体的位置,再根据坐标来实现后台点击,一直没找到更好办法,望解答,谢谢!
#15
yuma2022-05-21 22:12
回复 14楼 kings12333
不需要坐标,通过遍历第三方程序的控件句柄,直接向控件句柄发送单击或双击消息,即可完成单击或双击。

下面代码通过第三方程序的句柄,遍历其中包含的控件句柄。

程序代码:
'注意本程序有些控件句柄是获取不到的。

Private Const GW_CHILD = 5
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long


Private Sub FillChild(hWndParent As Long)
Dim hWndChild As Long
Dim szCaption As String
Dim buffer As String
Dim i As Long

hWndChild = GetWindow(hWndParent, GW_CHILD)
If (hWndChild = 0) Then Exit Sub
hWndChild = GetWindow(hWndChild, GW_HWNDFIRST)
If hWndChild = 0 Then Exit Sub

While (hWndChild <> 0)
szCaption = String$(255, 0)
GetClassName hWndChild, szCaption, 250
szCaption = Left$(szCaption, InStr(szCaption, String$(1, 0)) - 1)
buffer = CStr(hWndChild) & "--" & szCaption
i = GetWindowTextLength(hWndChild)
szCaption = String$(255, 0)
GetWindowText hWndChild, szCaption, 250
szCaption = Left$(szCaption, i)
buffer = buffer & "--" & szCaption

Debug.Print buffer
FillChild hWndChild
hWndChild = GetWindow(hWndChild, GW_HWNDNEXT)
Wend
End Sub

Private Sub GetChildWindow(hwnd As Long)
Dim szCaption As String
Dim buffer As String

Dim i As Long


szCaption = String$(255, 0)
GetClassName hwnd, szCaption, 250
szCaption = Left$(szCaption, InStr(szCaption, String$(1, 0)) - 1)

buffer = CStr(hwnd)
buffer = buffer & "--" & szCaption
i = GetWindowTextLength(hwnd)
szCaption = String$(255, 0)
GetWindowText hwnd, szCaption, 250
szCaption = Left$(szCaption, i)
buffer = buffer & "--" & szCaption
Debug.Print buffer
FillChild hwnd
End Sub

Private Sub Form_Load()
GetChildWindow 3277732 '3277732是指定的窗口句柄,hwnd则为自身句柄
End Sub
#16
kings123332022-05-21 22:32
回复 15楼 yuma
高手,ToolBar的子按钮没有句柄啊。。常见的Botton是很简单可以搞定,但针对ToolBar 这类控件我能想到的就是通过坐标来触发是最好的;你有这方面的案例吗?
#17
yuma2022-05-21 22:35
API操作其他程序中的按钮
https://blog.
#18
yuma2022-05-21 22:35
只有本站会员才能查看附件,请 登录


用这个软件查下看,是不是真的没有句柄。

查不到的句柄,可能是隐藏了。

[此贴子已经被作者于2022-5-21 22:40编辑过]

#19
kings123332022-05-21 22:43
回复 18楼 yuma
ToolBar控件有句柄,但里面有子按钮,子按钮没找到句柄
#20
yuma2022-05-22 12:43
找不到句柄,你是无法通过第三方程序操作它的。获取它的坐标也做不到。
#21
kings123332022-05-22 13:45
回复 20楼 yuma
如果找到Toolbar 子按钮的ID是否可以操作它?
#22
yuma2022-05-22 14:22
线程ID、进程ID 可以控件程序的运行状态,如进程挂起,进程结束,查看进程运行时长等信息。
有句柄号,窗口类名的话。可以向句柄号或窗口类名发各种API消息实现控制。
#23
yuma2022-05-22 16:39
您正在谈论的控件正在使用ToolbarWindow32类。如果要与他们互动,则需要使用工具栏控件的API /消息。例如,要启用按钮,您想使用TB_ENABLEBUTTON。  
#24
kings123332022-05-22 17:23
回复 22楼 yuma
找个ToolBar按钮,用SP++看看就知道子按钮根本没有句柄,没有句柄,常规的API操作不了它
#25
yuma2022-05-22 17:40
可能是绘制的按钮,不是控件,所以没有句柄。
#26
kings123332022-05-22 22:23
回复 25楼 yuma
有没有找ToolBar 里面子按钮ID的案例或代码。。
#27
yuma2022-05-23 18:32
网上很多,但代码无法正常运行。百度搜索:VB ToolbarWindow32     看一下。
#28
kings123332022-05-23 20:38
回复 27楼 yuma
谢谢 yuma..百度找到一篇文章可以改变TooBar的状态,但发送点击命令似乎无效,帮看看。谢谢!
程序代码:

============下面附上TB_ENABLEBUTTON源码,这个是成功的~


Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const PROCESS_ALL_ACCESS = &H1F0FFF

Private Const MEM_COMMIT = &H1000
Private Const MEM_DECOMMIT = &H4000

Private Const PAGE_READWRITE = &H4&

Private Const WM_USER As Long = &H400
Private Const TB_GETBUTTON As Long = (WM_USER + 23)
Private Const TB_ENABLEBUTTON As Long = (WM_USER + 1)

Private Type TBBUTTON
iBitmap As Long
idCommand As Long
fsState As Byte
fsStyle As Byte
bReserved(1) As Byte
dwData As Long
iString As Long
End Type

Private Function MAKELONG(ByVal a As Long, ByVal b As Long) As Long
MAKELONG = (b And &HFFFF&) * &H10000 + (a And &HFFFF&)
End Function

Function EnableTBButtion(ByVal hTBWnd As Long, ByVal lIndex As Long, Optional fEnabled As Boolean = True, Optional fIsIndex As Boolean = True) As Long
Dim utBtn As TBBUTTON
Dim lButtonID As Long
Dim lpRemote_utBtn As Long
Dim lProcessId As Long, hProcess As Long
hTBWnd = Text1.Text
Call GetWindowThreadProcessId(hTBWnd, lProcessId)

If fIsIndex Then
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, lProcessId)
If hProcess <> 0 Then
lpRemote_utBtn = VirtualAllocEx(ByVal hProcess, ByVal 0&, Len(utBtn), MEM_COMMIT, PAGE_READWRITE)
Call SendMessage(hTBWnd, TB_GETBUTTON, lIndex, ByVal lpRemote_utBtn)
Call ReadProcessMemory(ByVal hProcess, ByVal lpRemote_utBtn, utBtn, Len(utBtn), ByVal 0)
Call VirtualFreeEx(hProcess, ByVal lpRemote_utBtn, 0, MEM_DECOMMIT)
End If
CloseHandle hProcess
lButtonID = utBtn.idCommand
Else
lButtonID = lIndex
End If

EnableTBButtion = SendMessage(hTBWnd, TB_ENABLEBUTTON, lButtonID, ByVal MAKELONG(Abs(fEnabled), 0))
End Function

Private Sub Command2_Click()
'禁用第3个按钮
Debug.Print EnableTBButtion(&H17104A4, 3 - 1, False)
End Sub

Private Sub Command1_Click()
'启用第3个按钮
Debug.Print EnableTBButtion(&H17104A4, 3 - 1, True)
End Sub


#29
William19492022-05-24 18:46
获得 button ID,然后发 wm_command,不就行了。
wparam 的低字指定buttonId,高字为0,
lparam 指定toolbar句柄,
你上面的代码,已经可以获得id,应该不难吧。
#30
yuma2022-05-24 18:53
WIN10系统中返回0,未执行成功。
请在windows xp系统,甚至更低版本的系统中测试,使用管理员权限或许能成功。
不知你测试的是哪里的ToolBar
网上很多代码是以前的代码,在低版本系统下能正常运行。
#31
kings123332022-05-24 18:57
回复 29楼 William1949
按照你说的方法已经测试好了,经测试发现对于类型为:ToolbarWindow32的可以有效,但针对VB ToolBar控件类型 msvb_lib_toolbar 无效,但可以变更按钮状态,不知为何。
#32
kings123332022-05-24 18:58
回复 30楼 yuma
我在WIN7 测试的
#33
William19492022-05-24 19:11
以下是引用kings12333在2022-5-24 18:57:25的发言:

按照你说的方法已经测试好了,经测试发现对于类型为:ToolbarWindow32的可以有效,但针对VB ToolBar控件类型 msvb_lib_toolbar 无效,但可以变更按钮状态,不知为何。


不会吧?你试以下代码

Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM_READ = &H10
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Const MEM_COMMIT = &H1000
Private Const PAGE_READWRITE = &H4
Private Const MEM_RELEASE = &H8000&
Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long

Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111

Private Type TBBUTTON
   iBitmap      As Long
   idCommand    As Long
   fsState      As Byte
   fsStyle      As Byte
   bReserved1   As Byte
   bReserved2   As Byte
   dwData       As Long
   iString      As Long
End Type
Private Const TB_GETBUTTON = &H417

Private Sub Command1_Click()
    Dim hWnd As Long, Index As Long
   
    hWnd = 指定 toolbar 句柄
    Index = 指定 toolbar 索引,范围 = 0 ~ 按钮总数-1
    Call GotoButtonClick(hWnd, Index)
End Sub

Private Sub GotoButtonClick(ByVal hWnd As Long, ByVal Index As Long)
'hWnd      toolbar 句柄;
'Index     toolbar 索引,范围 = 0 ~ 按钮总数-1;
    Dim hParent As Long, ButtonID As Long
  
    hParent = GetParent(hWnd)
    ButtonID = GetButtonID(hWnd, Index)
    Call PostMessage(hParent, WM_COMMAND, ButtonID, ByVal hWnd)
End Sub

Private Function GetButtonID(ByVal hWnd As Long, ByVal Index As Long) As Long
    Dim ProcesshWnd As Long, ProcessId As Long, Buffer As Long, Len1 As Long
    Dim iButton     As TBBUTTON
   
    Len1 = LenB(iButton)
    Call GetWindowThreadProcessId(hWnd, ProcessId)
    ProcesshWnd = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ, 0, ProcessId)
    Buffer = VirtualAllocEx(ProcesshWnd, 0, Len1, MEM_COMMIT, PAGE_READWRITE)
   
    Call SendMessage(hWnd, TB_GETBUTTON, Index, ByVal Buffer)
    Call ReadProcessMemory(ProcesshWnd, Buffer, iButton, Len1, 0)
   
    GetButtonID = iButton.idCommand
    Call VirtualFreeEx(ProcesshWnd, Buffer, 0, MEM_RELEASE)
    Call CloseHandle(ProcesshWnd)
End Function

#34
kings123332022-05-24 19:47
回复 33楼 William1949
经测试代码对 VB ToolBar控件类 msvb_lib_toolbar,可以有效实现点击效果(ToolBarWin32类型的也同样有效),我对比了一下我的和你的使用函数的方式不同而已:
SendClick = PostMessage(Hwnd_JY, WM_COMMAND, lButtonID, 0) 'PostMessage(主窗口句柄, WM_COMMAND, 控件ID号, 0)
'--------------------------------------------'
Call PostMessage(hParent, WM_COMMAND, ButtonID, ByVal hWnd)
但是,接下来我用你的代码测试了FoxMail软件的TooBar类型为:TTBXToolbar ,代码是无效,


[此贴子已经被作者于2022-5-24 19:49编辑过]

#35
kings123332022-05-24 19:49
只有本站会员才能查看附件,请 登录
#36
William19492022-05-25 10:31
以下是引用kings12333在2022-5-24 19:47:35的发言:

经测试代码对 VB ToolBar控件类 msvb_lib_toolbar,可以有效实现点击效果(ToolBarWin32类型的也同样有效),我对比了一下我的和你的使用函数的方式不同而已:
SendClick = PostMessage(Hwnd_JY, WM_COMMAND, lButtonID, 0) 'PostMessage(主窗口句柄, WM_COMMAND, 控件ID号, 0)
'--------------------------------------------'
Call PostMessage(hParent, WM_COMMAND, ButtonID, ByVal hWnd)
但是,接下来我用你的代码测试了FoxMail软件的TooBar类型为:TTBXToolbar ,代码是无效,


第一:
你那个“Hwnd_JY”是什么?“主窗口句柄”是什么?是顶级窗口吗?如果是,那可能错了,你可发送到TooBar的父级,或直接发送到TooBar的窗口过程。

第二:
lparam,你设为0?应该指定TooBar的句柄吧?参考以下网址的Remarks部份:
https://docs.
只有本站会员才能查看附件,请 登录


第三:
看你的图,那个按钮旁有个小箭头,是下拉按钮吗?如果是?那可能是带有BTNS_WHOLEDROPDOWN 样式的按钮,其单击事件是由TBN_DROPDOWN消息产生的,而不是WM_COMMAND,所以发送失败。(不确定用你自己的代码,针对这种下拉按钮,是否成功,好奇!)

第四:
TTBXToolbar 类是什么?我没有FoxMail软件,没办法测试,它是由ToolbarWindow32派生出来的?还是用gdi自己画出来的“山寨 toolbar”

第五:
在想........
#37
kings123332022-05-25 10:42
回复 36楼 William1949
1.SendClick = PostMessage(Hwnd_JY, WM_COMMAND, lButtonID, 0) 'PostMessage(主窗口句柄, WM_COMMAND, 控件ID号, 0) 此种写法也是成功的,Hwnd_JY是主窗口句柄;
2.此种方式类似于发送菜单ID的方式,经测试没有问题
3.Foxmail软件百度随便可以下载安装,TTBXToolbar 类有可能是它自己的,搞不明白,不是toolBarWindows32的类 不会起作用的
#38
kings123332022-06-09 09:47
回复 36楼 William1949
又有个新东西,也是模拟点击Sys32TreeView,目前也同样获取了 节点的ID,发送点击事件WM_COMMAND没反应.
1