Option ExplicitConst MB_DEFBUTTON1 = &H0&
Const MB_DEFBUTTON2 = &H100&
Const MB_DEFBUTTON3 = &H200&
Const MB_ICONASTERISK = &H40&
Const MB_ICONEXCLAMATION = &H30&
Const MB_ICONHAND = &H10&
Const MB_ICONINFORMATION = MB_ICONASTERISK
Const MB_ICONQUESTION = &H20&
Const MB_ICONSTOP = MB_ICONHAND
Const MB_OK = &H0&
Const MB_OKCANCEL = &H1&
Const MB_YESNO = &H4&
Const MB_YESNOCANCEL = &H3&
Const MB_ABORTRETRYIGNORE = &H2&
Const MB_RETRYCANCEL = &H5&
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem 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 Const BM_CLICK = &HF5
Dim i As Long
Private Sub Command1_Click()
Timer1.Enabled = True
MessageBox Me.hwnd, "this is test", App.Title, MB_OK + MB_ICONEXCLAMATION
Timer1.Enabled = False
i = 0
End SubPrivate Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1000
End SubPrivate Sub Timer1_Timer()i = i + 1
If i >= 10 Then
Dim dlghwnd As Long
Dim buttonhwnd As Long
dlghwnd = FindWindow("#32770", App.Title)
buttonhwnd = GetDlgItem(dlghwnd, 2) '其中的2,用spy++获得
SendMessage buttonhwnd, BM_CLICK, 0&, ByVal 0&
End IfEnd Sub这段代码里面
dlghwnd = FindWindow("#32770", App.Title)
参数#32770是怎么取得,
buttonhwnd = GetDlgItem(dlghwnd, 2) '其中的2,用spy++获得
2用spy++获得,其它msgbox也是2吗

解决方案 »

  1.   

    参数#32770是怎么取得,
    ======================
    用spy++可以查出来的呀!
      

  2.   

    函数功能:该函数检索指定的对话框中的控制句柄。    函数原型:HWND GetDlgltem(HWND hDlg,int nlDDlgltem);    参数:    hDlg:标识含有控制的对话框。    nlDDlgltem:指定将被检索的控制标识符。    返回值:如果函数调用成功则返回值为给定控制的窗口句柄。如果函数调用失败,则返回值为NULL,表示为一个无效的对话框句柄或一个不存在的控制。若想获得更多错误信息,请调用GetLastError函数。    备注:可以通过使用任何父子窗口对来使用GetDlgltem函数,而不仅只是对话框。只要hDlg参数指定一个父窗口,且子窗口有一个独立的标识符(象CreateWindow中hMenu参数指定的或创建子窗口的CreateWindowEx指定的那样),GetDlgltem就会返回一个有效的句柄到子窗口。Windows CE:GetDlgltem函数只为对话框中的直接于控制工作,它不通过嵌套的对话框来搜寻。
      

  3.   

    #32770是win32里对话框的类名,不止msgbox,其他对话框都是的,用spy++看看就知道了!
      

  4.   

    这个还可以模块
      Option Explicit
      Public Const MAX_PATH As Long = 260&
      Public Const API_TRUE As Long = 1&
      Public Const API_FALSE As Long = 0&
       Public g_hBoldFont As Long
      
      Public Const MSGBOXTEXT As String = "Have you ever seen a standard message box with a different font than all the others on the system?"
      Public Const WM_SETFONT As Long = &H30
      Public Const NV_CLOSEMSGBOX As Long = &H5000&
      Public Const NV_MOVEMSGBOX As Long = &H5001&
      Public Const NV_MSGBOXCHNGFONT As Long = &H5002&
      Public Const MB_ICONQUESTION As Long = &H20&
      Public Const MB_TASKMODAL As Long = &H2000&
      Public Const SWP_NOSIZE As Long = &H1&
      Public Const SWP_NOZORDER As Long = &H4&
      Public Const HWND_TOP As Long = 0&  Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
      End Type
      Public Declare Function LockWindowUpdate& Lib "user32" (ByVal hwndLock&)
      Public Declare Function GetActiveWindow& Lib "user32" ()
      Public Declare Function GetDesktopWindow& Lib "user32" ()
      Public Declare Function FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$)
      Public Declare Function FindWindowEx& Lib "user32" Alias "FindWindowExA" (ByVal hWndParent&,ByVal hWndChildAfter&, ByVal lpClassName$, ByVal lpWindowName$)
     Public Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal  wMsg&, ByVal wParam&, lParam As Any)
      Public Declare Function MoveWindow& Lib "user32" (ByVal hWnd&, ByVal x&, ByVal y&,     ByVal nWidth&, ByVal nHeight&, ByVal bRepaint&)
      Public Declare Function ScreenToClientLong& Lib "user32" Alias "ScreenToClient" (ByVal hWnd&, lpPoint&)
      Public Declare Function GetDC& Lib "user32" (ByVal hWnd&)
      Public Declare Function ReleaseDC& Lib "user32" (ByVal hWnd&, ByVal hDC&)
      Public Const DT_WORDBREAK As Long = &H10&
      Public Const DT_CALCRECT As Long = &H400&
      Public Const DT_EDITCONTROL As Long = &H2000&
      Public Const DT_END_ELLIPSIS As Long = &H8000&
      Public Const DT_MODIFYSTRING As Long = &H10000
      Public Const DT_PATH_ELLIPSIS As Long = &H4000&
      Public Const DT_RTLREADING As Long = &H20000
      Public Const DT_WORD_ELLIPSIS As Long = &H40000
      
      Public Declare Function DrawText& Lib "user32" Alias "DrawTextA" (ByVal hDC&, ByVal lpsz$, ByVal cchText&, lpRect As RECT, ByVal dwDTFormat&)
      Public Declare Function SetForegroundWindow& Lib "user32" (ByVal hWnd&)
      Public Declare Function GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal hWnd&, ByVal lpClassName$, ByVal nMaxCount&)
     Public Declare Function GetWindowRect& Lib "user32" (ByVal hWnd&, lpRect As RECT)
      Public Declare Function SetWindowPos& Lib "user32" (ByVal hWnd&, ByVal hWndInsertAfter&, ByVal x&, ByVal y&, ByVal cx&, ByVal cy&, ByVal wFlags&)
      Public Declare Function MessageBox& Lib "user32" Alias "MessageBoxA" (ByVal hWnd&,    ByVal lpText$, ByVal lpCaption$, ByVal wType&)
      Public Declare Function SetTimer& Lib "user32" (ByVal hWnd&, ByVal nIDEvent&, ByVal uElapse&, ByVal lpTimerFunc&)
      Public Declare Function KillTimer& Lib "user32" (ByVal hWnd&, ByVal nIDEvent&)
    Public Sub TimerProc(ByVal hWnd&, ByVal uMsg&, ByVal idEvent&, ByVal dwTime&)
       KillTimer hWnd, idEvent
      Select Case idEvent
        Case NV_CLOSEMSGBOX '<-- we want to close this messagebox after 4 seconds
          Dim hMessageBox&
          hMessageBox = FindWindow("#32770", "Self Closing Message Box")
          If hMessageBox Then
            Call SetForegroundWindow(hMessageBox)
            SendKeys "{enter}"
          End If
        Case NV_MOVEMSGBOX '<-- we want to move this messagebox
          Dim hMsgBox&, xPoint&, yPoint&
          Dim stMsgBoxRect As RECT, stParentRect As RECT
          hMsgBox = FindWindow("#32770", "Position A Message Box")
          If hMsgBox Then
            Call GetWindowRect(hMsgBox, stMsgBoxRect)
            Call GetWindowRect(hWnd, stParentRect)
            xPoint = stParentRect.Left + (((stParentRect.Right - stParentRect.Left) \ 2) -           ((stMsgBoxRect.Right - stMsgBoxRect.Left) \ 2))
            yPoint = stParentRect.Top + (((stParentRect.Bottom - stParentRect.Top) \ 2) -           ((stMsgBoxRect.Bottom - stMsgBoxRect.Top) \ 2))
            If xPoint < 0 Then xPoint = 0
            If yPoint < 0 Then yPoint = 0
            If (xPoint + (stMsgBoxRect.Right - stMsgBoxRect.Left)) > (Screen.Width \ Screen.TwipsPerPixelX) Then
              xPoint = (Screen.Width \ Screen.TwipsPerPixelX) - (stMsgBoxRect.Right - stMsgBoxRect.Left)
            End If
            If (yPoint + (stMsgBoxRect.Bottom - stMsgBoxRect.Top)) > (Screen.Height \ Screen.TwipsPerPixelY) Then
              yPoint = (Screen.Height \ Screen.TwipsPerPixelY) - (stMsgBoxRect.Bottom - stMsgBoxRect.Top)
            End If
            Call SetWindowPos(hMsgBox, HWND_TOP, xPoint, yPoint,  API_FALSE, API_FALSE, SWP_NOZORDER Or SWP_NOSIZE)
          End If
          Call LockWindowUpdate(API_FALSE)    Case NV_MSGBOXCHNGFONT '<-- we want to change the font for this messagebox
          '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          ' NOTE: Changing the font of a message box is not recomemded!!
          '       This portion of the demo is just provided to show some of the possibilities
          '       for manipulating other windows using the Windows API.
          '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          hMsgBox = FindWindow("#32770", "Change The Message Box Font")
          If hMsgBox Then
            Dim hStatic&, hButton&, stMsgBoxRect2 As RECT
            Dim stStaticRect As RECT, stButtonRect As RECT
            hStatic = FindWindowEx(hMsgBox, API_FALSE, "Static", MSGBOXTEXT)
            hButton = FindWindowEx(hMsgBox, API_FALSE, "Button", "OK")
            If hStatic Then
             Call GetWindowRect(hMsgBox, stMsgBoxRect2)
              Call GetWindowRect(hStatic, stStaticRect)
              Call GetWindowRect(hButton, stButtonRect)
             Call SendMessage(hStatic, WM_SETFONT, g_hBoldFont, ByVal API_TRUE)
             
              With stStaticRect
                Call ScreenToClientLong(hMsgBox, .Left)
                Call ScreenToClientLong(hMsgBox, .Right)
                Dim nRectHeight&, nHeightDifference&, hStaticDC&
                nHeightDifference = .Bottom - .Top
                hStaticDC = GetDC(hStatic)
                nRectHeight = DrawText(hStaticDC, MSGBOXTEXT, (-1&), stStaticRect, T_CALCRECT Or DT_EDITCONTROL Or DT_WORDBREAK)
                Call ReleaseDC(hStatic, hStaticDC)
                nHeightDifference = nRectHeight - nHeightDifference
                Call MoveWindow(hStatic, .Left, .Top, .Right - .Left, nRectHeight, API_TRUE)
              End With
              With stButtonRect
                Call ScreenToClientLong(hMsgBox, .Left)
                Call ScreenToClientLong(hMsgBox, .Right)
                Call MoveWindow(hButton, .Left, .Top + nHeightDifference, .Right - .Left, .Bottom - .Top, API_TRUE)
              End With
              
              With stMsgBoxRect2
                ' resize and reposition the messagebox
                Call MoveWindow(hMsgBox, .Left, .Top - (nHeightDifference \ 2), .Right - .Left, (.Bottom - .Top) + nHeightDifference, API_TRUE)
               End With
            End If
          End If
          Call LockWindowUpdate(API_FALSE)
      End SelectEnd Sub
      

  5.   

    Option Explicit
      ' demo project showing how to use the API to manipulate a messagebox
      ' by Bryan Stafford of New Vision Software&reg; - [email protected]
      ' this demo is released into the public domain "as is" without
      ' warranty or guaranty of any kind.  In other words, use at
      ' your own risk.Private Sub Command1_Click()
      ' this shows a messagebox that will be dismissed after 4 seconds
      
      ' set the callback timer and pass our application defined ID (NV_CLOSEMSGBOX)
      ' set the time for 4 seconds (4000& microseconds)
      SetTimer hWnd, NV_CLOSEMSGBOX, 4000&, AddressOf TimerProc  ' call the messagebox API function
      Call MessageBox(hWnd, "4 &Atilde;&euml;&Ouml;&Oacute;&ordm;ó&acute;&Euml;&para;&Ocirc;&raquo;°&iquest;ò×&Ocirc;&para;&macr;&sup1;&Oslash;±&Otilde;", _
          "Self Closing Message Box", MB_ICONQUESTION Or MB_TASKMODAL)
      
    End SubPrivate Sub Command2_Click()
      ' this positions the messagebox in the desired location on the screen.
      ' the location is defined in the callback timer function
      
      ' lock the desktop so that the initial position is not shown
      Call LockWindowUpdate(GetDesktopWindow())
      
      ' set the callback timer with our application defined ID (NV_MOVEMSGBOX)
      ' set the time for 10 microseconds to allow the messagebox time to become active
      SetTimer hWnd, NV_MOVEMSGBOX, 10&, AddressOf TimerProc  ' call the messagebox API function
      Call MessageBox(hWnd, "&para;&Ocirc;&raquo;°&iquest;ò&frac34;&Oacute;&Ouml;&ETH;&Oacute;&Uacute;&acute;°&Igrave;&aring;&pound;¨&para;&oslash;&sup2;&raquo;&Ecirc;&Ccedil;&AElig;&Aacute;&Auml;&raquo;&pound;&copy;?", _
                                            "Position A Message Box", MB_ICONQUESTION Or MB_TASKMODAL)End SubPrivate Sub Command3_Click()
      ' this changes th font for the message text of the messagebox.
      ' the routine in the callback timer function
      
      ' lock the desktop so that the initial font is not shown
      Call LockWindowUpdate(GetDesktopWindow())
      
      ' set the callback timer with our application defined ID (NV_MSGBOXCHNGFONT)
      ' set the time for 10 microseconds to allow the messagebox time to become active
      SetTimer hWnd, NV_MSGBOXCHNGFONT, 10&, AddressOf TimerProc  ' call the messagebox API function
      Call MessageBox(hWnd, MSGBOXTEXT, "Change The Message Box Font", MB_ICONQUESTION Or MB_TASKMODAL)End SubPrivate Sub Form_Load()  ' we will use the font from the form to change the text in one of our message boxes
      ' first, set the attributes of the font that we will want to display.
      With Font
        .Bold = True
        .Italic = True
      End With
      
      ' next, grab a handle to the form's font and store it in the global variable for use later.
      ' don't change the font on the form or the value in the global variable will be invalid.
      Dim IFont As IFont
      Set IFont = Font  g_hBoldFont = IFont.hFont
      
      Set IFont = Nothing
      
    End Sub