【问题标题】:VBA How to use FindWindowEx when have Windows HandleVBA如何在有Windows句柄时使用FindWindowEx
【发布时间】:2019-10-31 00:01:49
【问题描述】:

我查看了您提交问题时弹出的众多“类似问题”,但不幸的是,这些问题都不适合我的问题,而且它们都是用 c++ 或 c# 编写的。

我找到this,它帮助我获得了句柄:

我的问题现在是我如何使用这个句柄在这个窗口上点击“否”:

我的 代码 下面正在努力检索 句柄 而没有错误(我假设句柄输出是正确的),但是我不确定去哪里,去哪里寻找帮助如何使用手柄点击“否”按钮。

非常感谢任何能帮助我指明正确方向的人。

Option Explicit

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowTextLength Lib "User32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Private Declare Function GetWindow Lib "User32" (ByVal hWnd As Long, ByVal uCmd As Long) As Long
Private Declare Function IsWindowVisible Lib "User32" (ByVal hWnd As Long) As Boolean

Private Const GW_HWNDNEXT = 2


Private Sub GetWindowHandle()

    Dim lhWndP As Long
    If GetHandleFromPartialCaption(lhWndP, "SAP GUI for Windows 740") = True Then
        If IsWindowVisible(lhWndP) = True Then
          MsgBox "Found VISIBLE Window Handle: " & lhWndP, vbOKOnly + vbInformation
        Else
          MsgBox "Found INVISIBLE Window Handle: " & lhWndP, vbOKOnly + vbInformation
          Debug.Print lhWndP
        End If
    Else
        MsgBox "Window not found!", vbOKOnly + vbExclamation
    End If

End Sub

Private Function GetHandleFromPartialCaption(ByRef lWnd As Long, ByVal sCaption As String) As Boolean

    Dim lhWndP As Long
    Dim sStr As String
    GetHandleFromPartialCaption = False
    lhWndP = FindWindow(vbNullString, vbNullString) 'PARENT WINDOW
    Do While lhWndP <> 0
        sStr = String(GetWindowTextLength(lhWndP) + 1, Chr$(0))
        GetWindowText lhWndP, sStr, Len(sStr)
        sStr = Left$(sStr, Len(sStr) - 1)
        If InStr(1, sStr, sCaption, vbTextCompare) > 0 Then
            GetHandleFromPartialCaption = True
            lWnd = lhWndP
            Exit Do
        End If
        lhWndP = GetWindow(lhWndP, GW_HWNDNEXT)
    Loop

End Function

【问题讨论】:

  • 我会先尝试使用 winapi 调用 SetFocus 然后使用 VBA SendKeys "%Y" 来单击按钮。如果这不起作用,您将需要使用 winapi EnumChildWindows 查找按钮句柄并使用 winapi SendMessage 或 PostMessage 来单击按钮。
  • @TinMan thxs 伙计。感谢指导帮助。我会做更多的研究。干杯

标签: excel vba winapi hwnd


【解决方案1】:

感谢@TinMan 和@Remy 为我指明了正确的方向。感谢您没有给我答案并允许我进行研究..

以下代码完美运行,将完全替换我之前的代码。

请注意,下面的代码更简洁。

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Const WM_COMMAND = &H111
Private Const IDNO = 7

Public Declare PtrSafe Function SendMessage Lib "user32.dll" Alias "SendMessageW" ( _
    ByVal hwnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    ByVal lParam As LongPtr) As LongPtr

Sub PressNo_SAPTimeout_Wnd()

   Dim hwnd As Long
   hwnd = FindWindow(vbNullString, "SAP GUI for Windows 740")

   If (hwnd <> 0) Then
      SendMessage hwnd, WM_COMMAND, IDNO, ByVal 0&
   Else
      MsgBox "Error finding message box!", vbOKOnly
   End If

End Sub

【讨论】:

  • @SiddharthRout 谢谢伙计。我喜欢自己找到答案,而不是依靠别人给我答案。只是在哪里/如何看。感谢您接受答案(如果是您自己)。
  • 是的,我确实赞成。当人们自我学习新事物时,我喜欢它:)
猜你喜欢
  • 2011-08-06
  • 2023-03-29
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多