Hallo Bernd,
<i>Private Const BUTTON_CAPTION = "Beenden" bringt auch nichts.
Hat es vlt. etwas hiermit zu tun "#32770"? Hat jeder Button eine spezielle Zahl?</i>
Alle Dialogboxen haben den Klassennamen "#32770", so wie Excel den Klassennamen XLMAIn hat.
Das hat also damit nichts zu tun.
Alle Buttons (Childwindows) haben eine ID-Nummer oder sollten diese haben. Hierüber kann man sie ansprechen.
Falls man keine ID vergeben hat, muss man den Button anders ansprechen, z.B. über den Captiontext.
Die ID eines Button kann Du Dir z.B. über ein Windowspyprogramm besorgen.
Ich habe mir mal eins gebastelt:
https://www.clever-excel-forum.de/Thread-Windows-Spy-und-Pixelfarben
Auf den ersten Blick müsste Dein Tool auch den Beenden-Button anklicken.
Du arbeitest hier ja mit FindWindowEx, das das entsprechend über den Buttontext erlaubt.
Ich kann es jetzt nicht testen, da Du nur einen Teil des Codes hier bereitstellst.
Vielleicht muss auch nur noch noch die Unterstreichungsmarkierung mit rein: "Be&enden".
Bedeutet, dass der Button durch Drücken von Alt-E getriggert wird.
PS: Dein Code ist noch für alte Excel, ggf. mal anpassen.....
Code:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 |
|
Private Declare PtrSafe Function FindWindowA Lib "user32" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function FindWindowExA Lib "user32" ( _
ByVal hWnd1 As LongPtr, _
ByVal hWnd2 As LongPtr, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As LongPtr
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As LongPtr, ByVal wMsg As Long, _
ByVal wParam As LongPtr, lParam As Any) As LongPtr
Private Const BM_CLICK = &HF5
Private Const GC_CLASSNAMEDIALOG = "#32770"
Private Const GC_CLASSNAMEBUTTON = "Button"
Private Const DIALOG_CAPTION = "Microsoft Office Excel"
Private Const BUTTON_CAPTION = "OK"
Public dtmNextTime As Date
Public Sub StartTimer()
Dim lngDialogHwnd As LongPtr, lngButtonHwnd As LongPtr
lngDialogHwnd = FindWindowA(GC_CLASSNAMEDIALOG, DIALOG_CAPTION)
If CBool(lngDialogHwnd) Then
lngButtonHwnd = FindWindowExA(lngDialogHwnd, ByVal 0&, GC_CLASSNAMEBUTTON, BUTTON_CAPTION)
If CBool(lngButtonHwnd) Then
Call SendMessageA(lngButtonHwnd, BM_CLICK, 0&, 0&)
End If
End If
dtmNextTime = Now + TimeSerial(0, 0, 10)
Application.OnTime dtmNextTime, "StartTimer"
End Sub
|
Du könntest alternativ auch über die ID gehen, der Beenden-Button müsste die ID 2 haben. Hängt aber vom Diaglog ab.
Code:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 |
|
Private Declare PtrSafe Function KillTimer Lib "user32" ( _
ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
Private Declare PtrSafe Function SetTimer Lib "user32" ( _
ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _
ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function SendDlgItemMessageA Lib "user32" ( _
ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long, _
ByVal wMsg As Long, ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr
Private Declare PtrSafe Function FindWindowA Lib "user32" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Dim mhTimer As LongPtr
Private Sub DlgClickProc()
' Klickt den gewünschten Button an
Dim hDlg As LongPtr
hDlg = FindWindowA("#32770", "SAP Meldung") ' MsgBox-Anzeige abfangen
If hDlg > 0 Then
SendDlgItemMessageA hDlg, 2, &HF5, 0&, 0& ' 6=ja, 2=nein/OK
KillTimer 0&, mhTimer ' Timer abschalten
End If
End Sub
|
Hier noch was zum Nachlesen, denn es geht auch mit dem Buttontext ohne FindwindowEx......
https://www.clever-excel-forum.de/Thread-Button-in-Dialogbox-automatisch-anklicken
Gruß aus Hessen
Karl-Heinz
|