Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1588to1592
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA: Maus bewegen und klicken
27.10.2017 22:37:08
Barbaraa
Hallo
habe neben meinem Excel-Sheet auch den Windows-Rechner geöffnet.
Nun soll ein Makro die Maus Folgendes in diesen Rechner klicken lassen:
1+2=
Wie gesagt: Klicken, nicht sendkeys.
Wie geht das am Besten?
Ich denke, das sollte irgendwie mit Bildschirmkoordinaten gehen. Doch zuvor muss ich die Klick-Koordinaten für die Tastenfelder "1", "+", "2" und "=" herausfinden. Und im Makro selbst die aktuelle Fensterposition vom Rechner-Fenster.
Warte gespannt auf Eure Hilfe.
LG,
Barbara

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Maus bewegen und klicken
27.10.2017 23:57:29
Ralf
Hi Barbara,
nehmen wir mal an, Du findest die Koordinaten für die Tasten 1, + und 2 auf dem Taschenrechner und schaffst es, die Maus auch tatsächlich dahin zu bewegen. Aber wie sagst Du jetzt dem Cursorsymbol, und jetzt klick mal auf den Button? :)
Es nutzt Dir alse nix, die Maus dahin zu bewegen. Du brauchst Zugriff auf die Funktionalität des Programms, dass Du manipulieren willst. In der Regel geschieht das über öffentliche Schnittstellen. Ich persönlich wüsste aber nicht, wie ich auf die Objekte und deren Routinen der Click Events des Taschenrechners zugreifen könnte. Und allein mit VBA düfte das auch kaum möglich sein. Da bist Du schneller, wenn Du Dir eine kleine Funktion in VBA schreibst, die Dir das Ergebnis von 1 + 2 ausgibt....:)
Anzeige
AW: VBA: Maus bewegen und klicken
28.10.2017 04:35:11
Barbaraa
Das schaffe ich schon irgendwie.
Den Cursor auf eine bestimmte Stelle zu schicken, würde mit SetCursorPos gehen, und der Klick mit mouse_event, beide aus aus Lib "user32".
Aber wie kann man per Makro die Klickposition in einem anderen Fenster bestimmen?
Also nach Makrostart 2 Sekunden warten (Frage: wie geht das?), und dann die Mauskoordinaten mit GetCursorPos holen. Das Problem ist nur, wie kann ich den handle des dort sichtbaren Fensters und dessen Positionskoordinaten bestimmen?
LG, Barbara
ich hoffe nur das es nicht geht!
28.10.2017 04:57:01
Matthias
Hallo
Denn wenn es solche Möglichkeiten gäbe, wie einfach wäre es dann für einen WebSiteBetreiber
z.B. ein "Sofort-Kaufen-Button-Klick" auszulösen.
In der Hoffnung das sowas nie funktionieren möge!
Gruß Matthias
Anzeige
AW: VBA: Maus bewegen und klicken
28.10.2017 09:38:40
Nepumuk
Hallo Barbara,
die Koordinaten eines Fenster kannst du über die Funktion GetWindowRect ermitteln. Die Funktion erwartet als Parameter das Handle des Fensters dessen Position du wissen willst. Das Handle suchst du über die FindWindow-Funktion. Diese Funktion benötigt als Parameter entweder den Klassennamen des Fensters oder dessen Caption, im Idealfall beides. Ich hab dir mal ein Beispiel gemacht, dabei verwende ich den Klassennamen des Windows 10 Rechners:
Option Explicit

Private Declare Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function GetWindowRect Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpRect As RECT) As Long

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Const GC_CLASSNAME_CALCULATOR As String = "ApplicationFrameWindow"

Public Sub Test()
    Dim lngHwnd As Long, lngReturn As Long
    Dim udtRect As RECT
    lngHwnd = FindWindowA(GC_CLASSNAME_CALCULATOR, "Rechner")
    If lngHwnd <> 0 Then
        lngReturn = GetWindowRect(lngHwnd, udtRect)
        If lngReturn <> 0 Then
            With udtRect
                Call MsgBox("Links: " & CStr(.Left) & vbLf & "Rechts: " & CStr(.Right) & _
                    vbLf & "Oben: " & CStr(.Top) & vbLf & "Unten: " & CStr(.Bottom), _
                    vbInformation, "Info")
            End With
        Else
            Call MsgBox("Fehler beim Eritteln der Koordinaten", vbCritical, "Fehler")
        End If
    Else
        Call MsgBox("Rechner nicht gefnden", vbCritical, "Fehler")
    End If
End Sub

Die Position der einzelnen Buttons kann ich nicht per Programm ermitteln da diese keine eingenen Fenster sind. Die musst du aus den Koordinaten des Fensters errechnen.
Gruß
Nepumuk
Anzeige
AW: VBA: Maus bewegen und klicken
28.10.2017 11:50:16
Barbaraa
Hallo Nepumuk,
hab's ausprobiert, leider ohne Erfolg, da "Rechner nicht gefunden". Wahrscheinlich passt der Klassenname nicht.
Geht das auch ohne Klassenname? Denn ich würde das auch gerne für eine andere Anwendung einsetzen, von dessen Klassenname ich sowieso keinen blassen Schimmer habe.
LG, Barbara
AW: VBA: Maus bewegen und klicken
28.10.2017 12:02:02
Nepumuk
Hallo Barbara,
öffne das Fenster der Anwendung die du per API manipulieren willst und lass dann folgenden Code laufen. So findest du den Klassennamen.
Option Explicit

Private Declare Function EnumWindows Lib "user32.dll" ( _
    ByVal lpEnumFunc As Long, _
    ByVal lParam As Long) As Boolean
Private Declare Function GetWindowTextA Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal lpString As String, _
    ByVal cch As Long) As Long
Private Declare Function GetWindowTextLengthA Lib "user32.dll" ( _
    ByVal hwnd As Long) As Long
Private Declare Function GetClassNameA Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowLongA Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal nIndex As Long) As Long

Private Const GWL_STYLE As Long = -16
Private Const WS_VISIBLE As Long = &H10000000
Private Const WS_BORDER As Long = &H800000

Private llngRow As Long

Public Sub Start()
    llngRow = 1
    Columns("A:C").ClearContents
    With Range("A1:C1")
        .Value = Array("Hwnd", "Klasse", "Caption")
        .Font.Bold = True
    End With
    Call EnumWindows(AddressOf WindowCallBack, ByVal 0&)
    Columns("A:C").AutoFit
    Tabelle1.Sort.SortFields.Clear
    Tabelle1.Sort.SortFields.Add Key:=Columns(2)
    With Tabelle1.Sort
        .SetRange Columns("A:C")
        .Header = xlYes
        .MatchCase = False
        .Apply
    End With
End Sub

Private Function WindowCallBack(ByVal lngHwnd As Long, ByVal lngParam As Long) As Long
    Dim strCaption As String, strClassName As String
    Dim lngReturn As Long, lngStyle As Long
    lngStyle = GetWindowLongA(lngHwnd, GWL_STYLE)
    If (lngStyle And (WS_VISIBLE Or WS_BORDER)) = (WS_VISIBLE Or WS_BORDER) Then
        strClassName = Space$(256)
        lngReturn = GetClassNameA(lngHwnd, strClassName, 256)
        strClassName = Left$(strClassName, lngReturn)
        lngReturn = GetWindowTextLengthA(lngHwnd)
        strCaption = Space$(lngReturn)
        Call GetWindowTextA(lngHwnd, strCaption, lngReturn + 1)
        llngRow = llngRow + 1
        Cells(llngRow, 1).Resize(1, 3) = Array(lngHwnd, strClassName, strCaption)
    End If
    WindowCallBack = 1
End Function

Gruß
Nepumuk
Anzeige
AW: VBA: Maus bewegen und klicken
28.10.2017 11:58:59
Barbaraa
Hallo Nepumuk,
habe nun GC_CLASSNAME_CALCULATOR durch vbNullString ersetzt, damit geht es auch ohne Klassennamen.
Danke nochmals für Deine Hilfe.
LG,
Barbara
AW: VBA: Maus bewegen und klicken
28.10.2017 12:47:45
Ralf
....schön, jetzt wird die Maus positioniert. Da fehlt ja nur noch das Wichtigste... der Klick auf den richtigen Button...;)
Sag mir bitte Bescheid wenn Du es geschafft hast einem Bild (nichts anderes ist die Cursoranzeige) beizubringen, dass es den Button, über dem das Bild gerade steht, auch drücken soll. Das würde mich wirklich brennend interessieren! Die x und y Position wären ja geschafft, jetzt nur noch die z Position (für die Tiefe) auf - 1 setzen?
Nicht zu oft wiederholen. Das gibt Dellen im Monitor....;)
Das, was Du willst, ist ein Ereignis für ein bestimmtes Objekt auslösen. Dazu musst Du
a) das Objekt (und besser noch, auch seine Eigenschaften, Methoden, Ereignishandler) kennen und
b) auch Zugriff darauf haben...
Anzeige
AW: VBA: Maus bewegen und klicken
28.10.2017 13:02:36
Nepumuk
Hallo Ralf,
so einfach geht ein Klick mit der linken Maustaste:
Option Explicit

Private Declare Sub mouse_event Lib "user32.dll" ( _
    ByVal dwFlags As Long, _
    ByVal dx As Long, _
    ByVal dy As Long, _
    ByVal cButtons As Long, _
    ByVal dwExtraInfo As Long)

Private Const MOUSEEVENTF_LEFTDOWN As Long = &H2
Private Const MOUSEEVENTF_LEFTUP As Long = &H4

Public Sub Test()
    Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA: Maus bewegen und klicken
28.10.2017 13:31:56
Ralf
...bin echt beeindruckt!
AW: VBA: Maus bewegen und klicken
29.10.2017 00:32:20
Barbaraa
Hi Nepumuk,
vielen Dank für Deine Antworten und Beispiele.
LG, Barbara
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen