AW: Trick mit Sendkeys für Fokusierung?!
06.02.2007 21:48:23
Till
Hallo Rainer!
O.k. ich versuch es mal 'kurz' zu beschreiben.
Ich möchte mit Excel (also einer im Vordergrund stehenden Userform) ein Office-externes Programm bedienen.
Hier der Ablauf:
Beim ersten Starten der Arbeitsmappe öffnet sich die Userform in den Vordergrund, der Rest des Arbeitsblattes verschwindet (wird ausgeblendet), danach wird das externe Programm aufgestartet.
Sobald das aktiv ist, werden verschiedene Meldungen automatisch weggeklickt. Danach ist man in der Hauptansicht des Programmes. Auf der rechten Seite sind verschiedene Messquerschnitte, abgebildet (in einer Liste untereinander und insgesamt 38 an der Zahl).
Nun bietet dieses Programm die Funktion, die Betriebsmeldungen der einzelnen Messquerschnitte abzurufen. Hierzu muss man in der Hauptliste auf den jeweiligen Querschnitt klicken und danach über das Hauptmenü des Programms über "STRG-O" ein weiteres Unterprogramm auswählen und dort dann mit "O.k." den Datenabruf der Meldungen anstoßen. Danach nur noch die Daten per "Alt-D-S" in eine Txt-Datei speichern. Danach lasse ich das UnterProgramm schließen und kehre zurück zur Userform (mit Fokus auf diese Userform in Excel).
Bisweilen hab ich diese oben geschilderte Prozedur für alle Messpunkte in die entsprechenden Makros für die Auswahl über eine Combobox geschrieben, wodurch man relativ komfortabel nur die Namen der Messpunkte auswählt und das Makro dann automatisch den Fokus auf das externe Programm setzt und die geschilderten Mausklicks und Aufrufe durchführt. Gleiches gilt für die anderen 37 Messpunkte analog, aber mit Mausklick immer einen Schritt weiter unten.
Mittels einer zweiten Combobox auf der Userform lass ich dann (wieder per Auswahl in Abhängigkeit von den einzelnen Querschnitten) im Hintergrund diese eben erzeugten Meldungen öffnen und in einer entsprechenden Listbox anzeigen.
Sobald ich hier eine zweite Auswahl treffe, wird die Listbox geleert und mit dem neuen Inhalt angezeigt.
Die zweite Combobox kann ich auch ganz gut ohne Sendkeys bedienen. Hier ist also nicht das Problem.
Alles andere klappt eigentlich auch ziemlich gut, nur soll der User (falls irgendwie möglich!!) nicht mitbekommen, dass zwischenzeitlich (im ersten Part) für ihn geklickt wird.
Kann man das irgendwie anders lösen?
Gruß Till
Hier mal ein Ausschnitt von meinem Code:
Option Explicit
Dim y, z, zz, yy
Declare
Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Sub Straße1() 'hier gibt es noch 37 analoge Fenster, die sich nur von einer jeweils anderen Mausposition und -klick (s.u.) unterscheiden
On Error Resume Next
'Keys an geöffneten Networkbrowser schicken mit sendkeys von <a href=""http://orlando.mvps.org/#SendKeys"">"http://orlando.mvps.org/#SendKeys"</a>
AppActivate "Autoscope Netzwerk Browser - v8.11" 'Fokus auf externes Programm setzen
Sleep 1500 'kurze Pause
SetCursorPos 340, 286 'Klick zur Auswahl des Messquerschnittes in Hauptliste des externen Programmes (Mausposition variiert dabei...)
DoEvents
mouse_event MOUSEEVENT_LEFTDOWN, 0&, 0&, 0&, 0&
DoEvents
mouse_event MOUSEEVENT_LEFTUP, 0&, 0&, 0&, 0&
DoEvents
Sleep 800
y = Shell("SendKeys.exe 2 2 ""Autoscope Netzwerk Browser - v8.11"" ""{PAUSE}%AA{DOWN}B""") 'Betriebsprotokoll STRG-O Starten
Sleep 3000
z = Shell("SendKeys.exe 1 2 ""Autoscope Betriebsprotokoll"" ""~"" 1") 'sofort Abfragen bestätigen
Sleep 3000
zz = Shell("SendKeys.exe 1 2 ""Autoscope Operations Log Viewer"" ""~"" 1") 'evtl. Fehler bestätigen
'danach noch als Txt-File speichern (muss noch eingebaut werden)
yy = Shell("SendKeys.exe 1 2 ""Autoscope Betriebsprotokoll"" ""%{F4}"" 1") 'Schließen des Betriebsmeldungsprogramms
Sleep 800
AppActivate "Verkehrsdaten- und Meldungsmanagement" 'so heißt das Fenster in Excel
End Sub