Zurück zur Homepage

Msgbox verschieben und zeitgesteuert schließen

Gleiches Prinzip wie in vba004.htm. Zwei Timer starten, Msgbox anzeigen, Handle ermitteln, Msgbox verschieben, Handle "Ja" oder "Nein" ? Button ermitteln, Klick darauf simulieren.

Beispieldatei msgboxclose.zip 28 kB

'*************************************
'* AddressOf
'* Ausgeknobelt von K. Getz und M. Kaplan
'*************************************

Private Declare Function GetVbaProjekt _
  Lib "vba332.dll" Alias "EbGetExecutingProj" _
  (hVBA As Long) As Long

Private Declare Function GetFunktionsnummerString _
  Lib "vba332.dll" Alias "TipGetFunctionId" _
  (ByVal hVBA As Long, ByVal strFuncNameUnicode _
  As String, strFunktionsnummer As String) As Long

Private Declare Function GetFunktionsnummerLong _
  Lib "vba332.dll" Alias "TipGetLpfnOfFunctionId" _

(ByVal hVBA As Long, ByVal strFunktionsnummer _
  As String, hlngFunction As Long) As Long

'************************************

Private Declare Function SetTimer Lib "user32" _
  (ByVal hwnd As Long, ByVal nIDEvent As Long, _
  ByVal uElapse As Long, ByVal lpTimerFunc _
  As Long) As Long

Private Declare Function KillTimer Lib "user32" _
  (ByVal hwnd As Long, ByVal nIDEvent 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 SetWindowPos Lib "user32" _
  (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
  ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
  ByVal cy As Long, ByVal wFlags As Long) As Long

'*************************************

Private Declare Function GetWindow Lib "user32" _
  (ByVal hwnd As Long, ByVal wCmd 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 PostMessage Lib "user32" _
  Alias "PostMessageA" (ByVal hwnd As Long, _
  ByVal wMsg As Long, ByVal wParam As Long, _
  ByVal lParam As Long) As Long

Private Const GW_CHILD = 5
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private hlngTimerKennung As Long
Private hlngTimerKennung1 As Long
Private Const strTitel = "AutoSchließenVerschieben"

Public Sub MsgBoxTest()
  SetMyTimer hlngTimerKennung1, 5000, "ApiTimer"
  SetMyTimer hlngTimerKennung, 50, "ApiTimer"
  MsgBox "Anzeigen der MSGBOX", vbYesNo, strTitel
  TimerZerstören hlngTimerKennung
  TimerZerstören hlngTimerKennung1
End Sub

Private Sub ApiTimer(ByVal hwndOwner&, _
  ByVal lngWindowMessage&, _
  ByVal hlngRückTimerKennung&, _
  ByVal lngTickCount&)
  'Diese Funktion wird vom Timer aufgerufen. Jeder
  'Fehler hier, oder in den Sub Prozeduren hat
  'sehr unangenehme Folgen.
  If hlngRückTimerKennung = hlngTimerKennung Then
    'Der Win Timer liefert hier in der Callbackfunktion
    'unter hlngRückTimerKennung eine Kennung, die beim
    'erzeugen als Handle geliefert wurde. Damit lassen
    'sich die Timer unterscheiden.
    TimerZerstören hlngTimerKennung
    MsgboxVerschieben
  End If
  If hlngRückTimerKennung = hlngTimerKennung1 Then
    TimerZerstören hlngTimerKennung1
    MsgboxSchließen
  End If
End Sub

Private Sub MsgboxVerschieben()
Dim hwnd&, hwnd1&, lngRück&, Beschriftung$
  hwnd = FindWindow("#32770", strTitel)
  'Ein Handle auf die MsgBox wird geliefert
  If hwnd <> 0 Then
    'SetWindowPos hwnd, 0, X-Pos., Y-Pos., 0, 0, 1
    SetWindowPos hwnd, 0, 200, 100, 0, 0, 1
    'MsgBox wird verschoben
  End If
End Sub

Private Sub TimerZerstören(Timerkennung As Long)
  'Der Timer wird zerstört
  If Timerkennung <> 0 Then _
    KillTimer 0, Timerkennung
End Sub

Private Sub SetMyTimer(Timerkennung As Long, Zeit As Long, _
  Callbackname As String)
  'hlngTimerKennung(1) ist eine auf Modulebene deklarierte
  'Variable, die als Referenz übergeben wird, um ein Handle
  'auf einen erzeugten Timer zurückzuliefern (Timerkennung).
  'Zeit in Millisekunden.
  'Callbackname ist der Name der Callbackfunktion, die vom
  'Windows Timer aufgerufen wird.
  Timerkennung = SetTimer(0, 0, Zeit, _
    GetFuncAdress(Callbackname))
End Sub

Private Sub MsgboxSchließen()
Dim hwnd&, hwnd1&, lngRück&, Beschriftung$
  On Error Resume Next
  hwnd = FindWindow("#32770", strTitel)
  'Ein Handle auf die MsgBox wird geliefert
  hwnd1 = GetWindow(hwnd, GW_CHILD)
  'Ein Handle auf ein Kindfenster der MsgBox
  Do
    Beschriftung = String(255, 0)
    'Buffer für Fenstertext
    lngRück = GetWindowText(hwnd1, Beschriftung, 250)
    Beschriftung = Left$(Beschriftung, InStr(1, _
      Beschriftung, Chr(0)) - 1)
    'Fenstertext wird geholt
    ' If LCase(Beschriftung) = "&nein" Then
    If LCase(Beschriftung) = "&ja" Then
      'Wenn Fenster Beschriftung Ja hat
      PostMessage hwnd1, WM_LBUTTONDOWN, 0, 0
      PostMessage hwnd1, WM_LBUTTONUP, 0, 0
      'Mausklick wird simuliert
    End If
    hwnd1 = GetWindow(hwnd1, GW_HWNDNEXT)
    'Nächstes Fenster auf gleicher Ebene holen
  Loop While hwnd1 <> 0

End Sub

'*************************************
'* AddressOf
'* Ausgeknobelt von K. Getz und M. Kaplan
'*************************************

Public Function GetFuncAdress&(strFunktion$)
Dim hVBA&, lngRück&, strFunktionsnummer$
Dim hlngFunction&, strFuncNameUnicode$
  strFuncNameUnicode = StrConv(strFunktion, vbUnicode)
  GetVbaProjekt hVBA
  If hVBA <> 0 Then
    lngRück = GetFunktionsnummerString(hVBA, _
      strFuncNameUnicode, strFunktionsnummer)
    If lngRück = 0 Then
      lngRück = GetFunktionsnummerLong(hVBA, _
        strFunktionsnummer, hlngFunction)
      If lngRück = 0 Then GetFuncAdress = _
        hlngFunction
    End If
  End If
End Function