2014-12-03 150 views
0

我正在尝试为“&是”按钮找到子窗口的句柄,因此我可以发送点击消息并按下它。 该窗口是一个确认另存为窗口,因为我试图将文件保存到一个具有相同名称的文件已存在的位置,所以我必须处理该确认弹出窗口。 “确认”窗口具有带有几个子窗口的结构,并具有相同的父级(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将它发送到主窗口并且什么也没有发生。 你能帮我吗? 在此先感谢!

+0

什么是你的代码是什么样子? – 2014-12-03 10:02:42

+1

[FindWindowEx](http://msdn.microsoft.com/en-gb/library/windows/desktop/ms633500(v = vs.85).aspx)API使用'GetWindowText'来查找名称。 '&'快捷键是否被返回? – 2014-12-03 10:14:13

+0

是否要以编程方式保存Excel工作簿并覆盖文件(如果存在但未收到提示)?可能使用'ActiveWorkbook.SaveCopyAs'是一个更简单的解决方案吗? – 2014-12-03 10:17:23

回答

1

使用MS Spy ++(附带Win32 SDK)查看窗口及其子窗口。如果您发现弹出窗口,您可以通过ID发送消息给按钮 - 无需查找按钮的HWND。即SendDlgItemMessage(hwnd, ID_BTN, BM_CLICK, 0, 0);。你会从Spy ++看到ID_BTN。

+0

谢谢,我也会尝试这种方式。但是每次运行它时都会有相同的ID? – Golemic 2014-12-03 10:35:19

0

我终于得到它使用:

hWndFind = GetNextWindow(hWnd, GW_HWNDNEXT)