【问题标题】:Find Child window查找子窗口
【发布时间】:2014-12-03 09:59:13
【问题描述】:

我正在尝试查找“&Yes”按钮的子窗口句柄,这样我就可以发送点击消息并按下它。 该窗口是一个确认另存为窗口,因为我正在尝试将文件保存到已存在同名文件的位置,因此我必须处理该确认弹出窗口。 Confirm 窗口的结构包含几个子窗口,它们具有相同的父窗口 (CtrlNotifySink)。 一些滚动,这似乎是非活动的,以及 &Yes, &No 按钮。

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 有自己的 Button 子窗口或其他子窗口。我如何通过不同的 CtrNotifySink 窗口搜索以找到包含 Yes 按钮的窗口,以便我可以单击它? 虽然我找到了 hwnd、hwnd1、hwnd2,但我找不到 hwnd3。它总是包含零。

我确实需要先找到它才能发送点击,对吗?因为我尝试使用 sendmessage 将其发送到主窗口,但没有任何反应。 你能帮我解决这个问题吗? 提前致谢!

【问题讨论】:

  • 你的代码是什么样的?
  • FindWindowEx API 使用GetWindowText 来查找名称。 &amp; 快捷字符是否会由此返回?
  • 是否要以编程方式保存 Excel 工作簿并在文件存在时覆盖文件而不得到提示?那么使用ActiveWorkbook.SaveCopyAs 可能是一个更简单的解决方案吗?
  • @Dirk Vollmar,我添加了我的代码。
  • @SST 的 Mike,**31656246 CtrlNotifySink N/A 73013478 按钮&是。它包含“&”,但我也尝试过它,以防万一。同样的结果......

标签: windows excel vba api


【解决方案1】:

使用 MS Spy++(随 Win32 SDK 提供)查看窗口及其子窗口。如果您找到弹出窗口,您可以通过其 ID 向按钮发送消息 - 无需查找按钮的 HWND。 IE。 SendDlgItemMessage( hwnd, ID_BTN, BM_CLICK, 0, 0);。您将从 Spy++ 中看到的 ID_BTN。

【讨论】:

  • 谢谢,我也会试试的。但是每次我运行它都会有相同的ID吗?
【解决方案2】:

我终于搞定了:

hWndFind = GetNextWindow(hWnd, GW_HWNDNEXT)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多