API获取一个指定程序的一个按钮的句柄需要什么条件?
获取后,执行它,具体怎么写呢?

解决方案 »

  1.   

    ''''''form1
    Private Const SWP_HIDEWINDOW = &H80
    Private Const SWP_SHOWWINDOW = &H40
    Private Const GW_CHILD = 5
    Private Const GW_HWNDNEXT = 2
    Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
    Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Private Declare Function GetDesktopWindow Lib "user32" () As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd 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 GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch 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 GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202
    Private Sub Command1_Click()
      Dim cmdHwnd As Long
      Dim frmHwnd As Long
      Dim re As RECT
      Dim X As Long, Y As Long
      Dim xy As Long
      
      frmHwnd = FindWindow(vbNullString, "Form2")
      
      cmdHwnd = GetMessage(frmHwnd, "", "Command1")
      
      
      
      If cmdHwnd > 0 Then
         GetWindowRect cmdHwnd, re
         X = re.Left
         Y = re.Top
         xy = (X + 5) * 2 ^ 8 + (Y + 5)
         
         SendMessage cmdHwnd, WM_LBUTTONDOWN, xy, 0
         
         SendMessage cmdHwnd, WM_LBUTTONUP, xy, 0
      End If
    End Sub
    '*************************************************************************
    '**函 数 名:GetMessage
    '**输    入:hWnd(Long)                     -
    '**        :strData(String)                -
    '**        :Optional strClass(String = "") -
    '**        :Optional strName(String = "")  -
    '**        :Optional strSP(String = "")    -
    '**输    出:(Long) -
    '**功能描述:获得父窗体下所有子窗体的类名和窗体名
    '**全局变量:
    '**调用模块:
    '**作    者:
    '**日    期:
    '**修 改 人:
    '**日    期:
    '**版    本:版本1.0
    '*************************************************************************
    Public Function GetMessage(hwnd As Long, Optional strClass As String = "", Optional strName As String = "", Optional strData As String = "", Optional strSP As String = "") As Long
        Dim sClass As String * 250
        Dim sName As String * 250
        Dim hStartbutton As Long
        Dim lngLen(1) As Long
        Dim num As Integer
        Dim strSpace As String
           
        If hwnd < 0 Then Exit Function
         
        If Len(strData) > 0 Then strSpace = strSP + "   "
        
        hStartbutton = GetWindow(hwnd, GW_CHILD)
       
      Do
        '---------------------
             
             
             lngLen(0) = GetClassName(hStartbutton, sClass, 250)            '取类名
             lngLen(1) = GetWindowText(hStartbutton, sName, 250)            '取窗体名
             
             If lngLen(0) = 0 And lngLen(1) = 0 Then
                Exit Do
             End If
             
             num = num + 1
             strData = strData + strSpace + Format(num, "0、") + Format(hStartbutton, "0") + "[" + Left$(sClass, lngLen(0)) + "] -- (" + Left$(sName, lngLen(1)) + ")" + vbCrLf
             
             '---------------
             If Len(strClass) > 0 Or Len(strName) > 0 Then
                If Len(strClass) > 0 And Len(strName) > 0 Then
                    If strClass = Left$(sClass, lngLen(0)) And strName = Left$(sName, lngLen(1)) Then
                       GetMessage = hStartbutton
                       Exit Do
                    End If
                End If
                If Len(strClass) > 0 Then
                    If strClass = Left$(sClass, lngLen(0)) Then
                       GetMessage = hStartbutton
                       Exit Do
                    End If
                End If
                If Len(strName) > 0 Then
                    If strName = Left$(sName, lngLen(1)) Then
                       GetMessage = hStartbutton
                       Exit Do
                    End If
                End If
             End If
                     
             '----------------
             Call GetMessage(hStartbutton, "", "", strData, strSpace)
             
             hStartbutton = GetWindow(hStartbutton, GW_HWNDNEXT)
         '----------------------
       LoopEnd FunctionPrivate Sub Form_Load()
      Form2.Show
    End Sub'''''form2
    Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      MsgBox "sdfas"   '
    End Sub
      

  2.   

    我试了,能触发MouseDown时间,Click事件有些不好触发
      

  3.   

    ‘添以下代码可以触发Click事件
    Private Const MOUSEEVENTF_LEFTDOWN = &H2
    Private Const MOUSEEVENTF_LEFTUP = &H4
    Private Const MOUSEEVENTF_ABSOLUTE = &H8000 '  absolute move
    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 ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
    Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As LongPrivate Sub Command1_Click()
      Dim cmdHwnd As Long
      Dim frmHwnd As Long
      Dim re As RECT
      Dim x As Long, y As Long
      Dim xy As Long
      Dim points As POINTAPI
      
      frmHwnd = FindWindow(vbNullString, "Form2")
      
      cmdHwnd = GetMessage(frmHwnd, "", "Command1")
      
      
      
      If cmdHwnd > 0 Then
    '     GetWindowRect cmdHwnd, re
    '     X = re.Left
    '     Y = re.Top
    '     xy = (X + 5) * 2 ^ 8 + (Y + 5)
    '
    '     SendMessage cmdHwnd, MOUSEEVENTF_ABSOLUTE Or WM_LBUTTONDOWN, xy, 0
    '     SendMessage cmdHwnd, MOUSEEVENTF_ABSOLUTE Or WM_LBUTTONUP, xy, 0   ClientToScreen cmdHwnd, points
       SetCursorPos points.x + 10, points.y + 10
       
      
       mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTDOWN, points.x + 100, points.y + 110, 0, 0
       mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTUP, points.x + 100, points.y + 110, 0, 0  End If
    End Sub
      

  4.   

    搞一下SDK编程试试吧,能学到很多
      

  5.   

    findwindow
    enumchildwindows
    getclassname
    keybd_event
      

  6.   

    yefanqiu(叶帆) ,感激,感激不禁,您的代码真的很值!