Per Skript sekundären Monitor in den Fokus bringen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Per Skript sekundären Monitor in den Fokus bringen

Post by Stroker-007 » 01 Apr 2021, 16:04

Hallo Gemeinde!

Nicht "WinActivate", sondern "MonActivate" (ist jetzt eine Erfindung von mir, um die Frage kurz und bündig zu veranschaulichen ;-) )

Über ein Skript - unabhängig davon, wie oder womit das nun gestartet wird - will ich einen der sekundären Monitore und somit dessen Fenster/Anwendung darauf in den Fokus bringen, um dann vom Hauptmonitor aus weitere Befehle an dieses Fenster zu senden, ohne hierfür erst zu Fuß mit der Maus den Weg zu diesem Monitor machen zu müssen.

Welches Fenster auf diesem Monitor aktivieren?
Das ist so ziemlich egal, da ich i.d.R. nur eine Anwendung darauf laufen habe, die dann somit den Fokus bekommt. Falls aber doch mal mehrere Anwendungen darauf laufen, soll logischerweise das oberste Fenster den Fokus bekommen. Grad so, als würde ich mit der Maus in der Mitte dieses Monitors eine Aktion (z.B. eine StrokeIt-Mausgeste) ausführen. Dann erhält automatisch das darunterliegende Fenster den Fokus.

Warum nicht "WinActivate" verwenden?
1. Wenn mehrere Instanzen des gleichen Programms auf diversen Monitoren laufen, wird das schwierig.
2. Wenn ich unabhängig von dem Programm/Fenster, das auf Monitor [n] gerade läuft, dorthin eine Tastatureingabe senden will, dann geht das auch nicht, weil das ja immer mal ein anderes Programm sein kann.

Monitor-Identifikation?
Windows weiß da genau Bescheid. In Systemsteuerung/Bildschirmauflösung sind alle aktivierten Monitore und auch deren Klassifizierung (Haupt/Sekundär) mit Nummer und sogar Position aufgelistet und gezeigt. Soweit verfügbar, kennt Windows sogar den Hardware-Namen der einzelnen Kisten. Da es jedoch auch (ältere) Monitore ohne Hardware-Kennung (Unknown) gibt, taugt diese Identifizierungsmethode leider nur bedingt für das Skript. Warum Leider? Weil Windows mit den Monitornummern und deren Position leider gern Roulette spielt, je nach Anlaß. Deshalb gibt es auch Multimonitor-Tools wie Ultramon, um diese Unart per Profile einigermaßen in den Griff zu kriegen, was auch nicht immer gelingt. Somit bleibt für eine sichere Indentifikation nur die Windows-Nummerierung, auch wenn es eine relative Sache ist. Aber zur Not kann ich so ein Skript anpassen, falls Windows wiedermal spinnt (kommt in einer stabilen Umgebung aber eher selten vor). Aber als Alternative bei reinrassig namentlich angezeigten Monitoren wäre die Hardware-Identifizierung natürlich professionellste Sahne. Dann kann Windows rumzicken wie es will...

Daß das prinzipiell geht, zeigt z.B. der MPC (MediaPlayerClassic): mpc-hc64.exe [Datei] /monitor 5 /fullscreen ... und Bingo!

Suche ich im Internet danach, krieg ich nichts dazu, nur tonnenweise Tipps, wie man einen sekundären Monitor aktiviert, also einschaltet. Das ist bei dieser Frage aber nicht gemeint.

MonAvtivate [n] :-) - Warum das Ganze?
Sehr einfach: ich will mir den oft weiten Maus-Weg zu Monitor [n] sparen, wenn ich doch nur mal [PgDn] machen will, oder [Esc], was auch immer, und dann den ganzen langen Weg gleich wieder zurück. Oder das von einem Skript alle 2 Minuten erledigen lassen will.

Wer schüttlelt sowas aus dem Ärmel?
Vermutlich nur ein 1-Zeiler für den, der´s weiß ;-)

Vielen Dank!
Stroker-007

Edit:
Falls das doch nicht so simpel seine sollte, wäre es auch denkbar, zuerst per WinActivate das Fenster anzugeben, und dann zu sagen, welches dieser Fenster (falls mehrere gleiche davon geöffnet) auf welchem Monitor gemeint ist.
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Per Skript sekundären Monitor in den Fokus bringen

Post by just me » 02 Apr 2021, 11:01

Moin,

Monitore/Displays lassen sich nicht aktivieren. Sie sind entweder an oder aus.

Anders ist es bei Fenstern. Wenn Du mehrere Fenster derselben Anwendung auf mehrere Monitore verteilt hast, kannst Du den zu einem bestimmten Fenster gehörenden Monitor ermitteln. Dafür kannst Du mit

Code: Select all

WinGet, Liste, List, ...
eine Liste der IDs (HWNDs) der Anwendungsfenster erstellen und dann prüfen, ob ein und welches Fenster auf dem Dich interessierenden Monitor steht.
:arrow: [LIB] MDMF - Multiple Display Monitor Functions

Dieses Fenster kannst Du dann aktivieren und senden, was immer Du willst.
Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Per Skript sekundären Monitor in den Fokus bringen

Post by Stroker-007 » 02 Apr 2021, 12:24

Danke - erst mal!

Das hört sich logisch und vielversprechend an. Daß man einen "Monitor" nicht aktivieren kann, ist/war mir schon klar (auch wenn ich das nicht so direkt geschrieben hatte), denn dieses "Aktivieren" als "in den Fokus bringen" kann sich ja nur auf Fenster beziehen. Drum hab ich das ganze ja so ausführlich erklärt.

Das andere Ding ist, daß ich als AHK-Neuling nach einem ersten Check Deiner Herangehensweise noch nicht überblicken kann, ob ich das gebacken krieg. Habe noch Mühe, solche komplexeren Skripte zu verstehen. Aber ich werd mich mal reinbeißen.

Als alternative Strategie fiel mir noch folgendes ein:

Alle Monitore zusammen bilden ja ein großes x/y-Koordinatensystem, das u.a. zum managen von Icons (DesktopOK, Ultramon etc.) vorrangig verwendet wird. Es wäre also vorstellbar, einen Tastaturbefehl an einen bestimmten Koordinatenpunkt meiner Wahl zu senden, genau dahin, wo ich für eine Aktion manuell mit der Maus hinfahren würde. Da geht´s nicht genau her. Grob Fenstermitte genügt, wenn die Anwendung sowieso als Vollbild läuft.

Oder noch realistischer: per Maus und Koordinaten einen "Monitor aktivieren" (schon wieder diese unmögliche Ausdrucksweise, verzeih, trifft´s aber pfeilgrad).
Da gibt es den CLICK - Befehl. Schon mal vielversprechend. Und sicher noch weitere interessante in Abteilung "Maus und Tastatur". Habs jetzt noch nicht studiert. Aber ist ein Denk-Niveau, das ich vorerst wahrscheinlich eher bewältige. Mal sehn...
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Per Skript sekundären Monitor in den Fokus bringen

Post by just me » 03 Apr 2021, 02:25

Moin,

wenn Du sicher weißt, dass Deine "Anwendung" im Vollbild auf einem bestimmten Monitor läuft, kannst Du zum Aktivieren natürlich auch einfach klicken. Die Koordinaten des Monitors bekommst Du auch mit

Code: Select all

SysGet, OutputVar, Monitor, N
https://ahkde.github.io/docs/commands/SysGet.htm
Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: Per Skript sekundären Monitor in den Fokus bringen  Topic is solved

Post by Stroker-007 » 07 Apr 2021, 16:59

n´Abend - und danke!
Der SysGet-Befehl könnte für meine weiteren Belange nochmal sehr wertvoll sein.

Aber für meinen aktuellen Fall, wie die Frage oben, habe ich nun die einfachste und zugleich perfekte Lösung gefunden, ähnlich wie ich es oben schon angedeutet hatte: Aktivierung durch Klick auf Maus-Koordinaten im großen weiten Monitore-Geofeld. Das kann nicht nur AHK, dafür gibt es zahlreiche weitere kleine Tools.

Wie aber gelingt das ohne größeren "Kollateralschaden" an der laufenden Software? Ein Klick mit der RECHTEN Maustaste öffnet in den meisten Fällen das Kontextmenü der Anwendung, das i.d.R. noch nichts macht, sondern nur was anbietet. Wenn ich das aber eben nicht will, dann klicke ich (lasse ich klicken :-) ) sofort danach mit der LINKEN Maustaste nur etwas daneben außerhalb dieses Menü´s, und es verschwindet wieder, ohne daß durch diesen LINKS-Klick etwas am laufenden Programm ausgelöst wird. Außerdem habe ich durch dieses kurze optische Aufblitzen des Kontextmenü´s (~0,2 sec) eine perfekte Kontrolle über den Erfolg der Aktion auf dem gewünschten Monitor. Und jetzt kann ich vom Hauptmonitor aus alles hinschicken, was ich will: manuell, per Menü-Knopf, Batchdatei etc. Aber ich kann diese Aktivierung auch automatisch von einem Skript (Batch, vbs, AHK, StrokeIt, RemoteKeys...) machen lassen, bevor dieses dann die weiteren Aktionen durchführt.

Katze, Sack, Affe, tot, oder so ähnlich.
Stroker-07
Post Reply

Return to “Ich brauche Hilfe”