我正在尝试为“&是”按钮找到子窗口的句柄,因此我可以发送点击消息并按下它。 该窗口是一个确认另存为窗口,因为我试图将文件保存到一个具有相同名称的文件已存在的位置,所以我必须处理该确认弹出窗口。 “确认”窗口具有带有几个子窗口的结构,并具有相同的父级(CtrlNotifySink)。 一些滚动,这似乎是无效的,并&是的,&没有按钮。查找子窗口
Public Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare PtrSafe Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Public Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare PtrSafe Function SendMessageByString Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Public Declare PtrSafe Function SetActiveWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
Public Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdSHow As Long) As Long
Public Declare PtrSafe Function BringWindowToTop Lib "user32" (ByVal lngHWnd As Long) As Long
Public Declare PtrSafe Function EnableWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal fEnable As Long) As Long
Public Declare PtrSafe Function GetActiveWindow Lib "user32"() As Long
Public Declare PtrSafe Function GetFocus Lib "user32.dll"() As Long
Public Const WM_CLOSE As Long = &H10
Public Const SW_SHOW As Integer = 5
Public Const WM_SETTEXT As Long = &HC
Public Const BM_CLICK As Long = &HF5&
Sub PulseAutomation()
CCPUlse = FindWindow("Afx:00E80000:8:00010005:00000000:5DF82B2F", vbNullString)
MDIClient = FindWindowEx(CCPUlse, 0&, "MDIClient", vbNullString)
view13844 = FindWindowEx(MDIClient, 0&, vbNullString, "Inbound 13844 Queues")
view13845 = FindWindowEx(MDIClient, 0&, vbNullString, "Inbound 13845 Queues")
viewTSUMDL = FindWindowEx(MDIClient, 0&, vbNullString, "TSU MDL Queue")
viewOutSource = FindWindowEx(MDIClient, 0&, vbNullString, "OUTSOURCE")
viewAgentGroup = FindWindowEx(MDIClient, 0&, vbNullString, "Agent Group")
If view13844 = 0 Or view13845 = 0 Or viewTSUMDL = 0 Or viewOutSource = 0 Or viewAgentGroup = 0 Then
MsgBox "Check CCPulse Views. Views :Inbound 13844 Queues, Inbound 13845 Queues, TSU MDL Queue, OUTSOURCE, Agent Group, must be enabled)"
Else
view13844BringWindowToTop = BringWindowToTop(view13844)
DoEvents
SendKeys "%", True
SendKeys "{DOWN}", True
SendKeys "{DOWN}", True
SendKeys "{DOWN}", True
SendKeys "{DOWN}", True
SendKeys "{DOWN}", True
SendKeys "{DOWN}", True
SendKeys "~", True
Application.Wait (Now + #12:00:01 AM#)
SaveAsWindow = FindWindow(vbNullString, "Save as HTML")
TextComboBox = FindWindowEx(SaveAsWindow, 0&, "ComboBoxEx32", vbNullString)
ComboBox = FindWindowEx(TextComboBox, 0&, "ComboBox", vbNullString)
EditComboBox = FindWindowEx(ComboBox, 0&, "Edit", vbNullString)
Application.Wait (Now + #12:00:01 AM#)
Call SendMessageByString(EditComboBox, WM_SETTEXT, 0, "http://inhol/Inbound 13844 Queues.html")
DoEvents
SaveButton = FindWindowEx(SaveAsWindow, 0&, "Button", "&Save")
Call EnableWindow(SaveButton, True)
Call SendMessage(SaveButton, BM_CLICK, 0&, ByVal 0&)
DoEvents
Application.Wait (Now + #12:00:02 AM#)
hWnd = FindWindow(vbNullString, "Confirm Save As")
If SaveasConfirmationButton <> 0 Then
hWnd1 = FindWindowEx(hWnd, 0&, "DirectUIHWND", vbNullString)
hWnd2 = FindWindowEx(hWnd1, 0&, "CtrlNotifySink", vbNullString)
hwnd3 = FindWindowEx(hWnd2, 0&, "Button", "&Yes")
Call SendMessage(hwnd3, BM_CLICK, 0&, ByVal 0&)
Application.Wait (Now + #12:00:01 AM#)
DoEvents
End If
End Sub
窗口结构是财产以后这样的:
12519822 #32770 Confirm Save As
148708704 DirectUIHWND N/A
62856910 CtrlNotifySink N/A
65934476 ScrollBar N/A
84414422 CtrlNotifySink N/A
46533118 ScrollBar N/A
51578040 CtrlNotifySink N/A
56371342 ScrollBar N/A
204155690 CtrlNotifySink N/A
103359250 ScrollBar N/A
79695992 CtrlNotifySink N/A
70715476 SysLink N/A
25107220 CtrlNotifySink N/A
120982920 SysLink N/A
**31656246 CtrlNotifySink N/A
73013478 Button &Yes
29561694 CtrlNotifySink N/A
82250158 Button &No**
有多种CtrNotifySink有自己的按钮子窗口或其他子窗口。我如何搜索不同的CtrNotifySink窗口来查找包含“是”按钮的窗口,以便我可以向其发送点击? 虽然我发现hwnd,hwnd1,hwnd2,我找不到hwnd3。它总是包含零。
我需要找到它之前我可以发送一个点击,对不对?因为我尝试使用sendmessage将它发送到主窗口并且什么也没有发生。 你能帮我吗? 在此先感谢!
什么是你的代码是什么样子? – 2014-12-03 10:02:42
[FindWindowEx](http://msdn.microsoft.com/en-gb/library/windows/desktop/ms633500(v = vs.85).aspx)API使用'GetWindowText'来查找名称。 '&'快捷键是否被返回? – 2014-12-03 10:14:13
是否要以编程方式保存Excel工作簿并覆盖文件(如果存在但未收到提示)?可能使用'ActiveWorkbook.SaveCopyAs'是一个更简单的解决方案吗? – 2014-12-03 10:17:23