satipfan Posted October 12, 2016 Share Posted October 12, 2016 Wie kann man eine per Kommandozeile gestartete Aufnahme per Kommandozeile ohne aufpoppendes Bestätigungsfenster abbrechen bzw. den DVBViewer bei laufender Aufnahme ohne Bestätigungsfenster beenden? Quote Link to comment
Griga Posted October 12, 2016 Share Posted October 12, 2016 (edited) Dazu braucht du ein Tool, das Windows-Botschaften an Programme senden kann, z.B. http://stefanstools.sourceforge.net/SendMessage.html Ich habe es gerade (nach Umbenennen des Tools in SendMessage.exe) mit der Kommandozeile SendMessage /windowtitle:"DVB_Viewer" /message:22 /wparam:1 /lparam:0 probiert, und das klappt. Die Botschaft 22 entspricht WM_ENDSESSION. Sie lässt den DVBViewer glauben, Windows würde jetzt sofort und unwiderruflich runtergefahren. P.S. Bitte ersetze in der obigen Kommandozeile den Unterstrich durch ein Leerzeichen! Jemand hat es gefallen, die Forumsoftware so zu frisieren, dass sie das Blank wegkorrigiert Edited October 12, 2016 by Griga Quote Link to comment
satipfan Posted October 14, 2016 Author Share Posted October 14, 2016 Danke für den Hinweis! Das ist leider nur ein Workaround statt einer "sauberen" Lösung. Mit der ActionID 12326 kann man den DVBViewer zwar ohne Nachfrage beenden, aber nur solange keine Aufnahme läuft. Das Gleiche gilt für die ActionID 34 bei laufender Aufnahme. Es fehlt offensichtlich eine ActionID zum direkten Beenden einer Aufnahme ohne Nachfrage. Quote Link to comment
nuts Posted October 14, 2016 Share Posted October 14, 2016 (edited) Die Funktion "Beenden ohne Nachfrage bei laufenen Aufnahmen" ist im DVBViewer überhaupt nicht vorgesehen oder kriegst du das auf irgendeinem Weg (ausser dem Umweg von Griga) hin? In dem Fall würde ja nicht nur eine ActionID sondern auch die ganze LogiK dahinter fehlen. Edited October 14, 2016 by nuts Quote Link to comment
Griga Posted October 14, 2016 Share Posted October 14, 2016 Das ist leider nur ein Workaround statt einer "sauberen" Lösung. Wieso? Du hat genau das bekommen, wonach du gefragt hast. Vielleicht war deine Frage nicht richtig gestellt? Quote Link to comment
satipfan Posted January 22 Author Share Posted January 22 (edited) So, jetzt muss ich dort fortfahren, wo wir vor fast 8 (!) Jahren aufgehört haben. Die damals von dir vorgeschlagene Lösung basiert auf der taskkill.exe von Windows und killt alle offenen Fenster mit dem angegebenen Namen. Nunmehr habe ich die Möglichkeit, mit 2 Instanzen zu arbeiten. Das bedeutet, es gibt 2 Fenster mit dem Namen "DVDViewer Pro". Folglich werden sie auf Grund der Namensgleichheit beide gemeinsam gekillt. Und hier wird sichrbar, wie "unsauber" diese Lösung ist, denn es sollte ja nur eine der Instanzen beendet werden. Da hilft bei laufender Aufnahme leider weder die ActionID 12326, die das Programm laut http://de.DVBViewer.tv/wiki/Actions.ini ohne Nachfrage beenden soll, noch die zusätzliche Aktivierung von "Ohne Nachfrage beenden" in den Einstellungen > Erweitert. Es erfogt bei Anwendung dieser ActionID nämlich die Nachfrage "Sind Sie sicher?" Mit der Arbeitsweise dieser ActonID könnte man gut leben, gäbe es eine ActionID, die das Gleiche ausführt wie der Tastendruck auf die OK-Taste der Ferndedienung im Anschluss auf die Nachfrage - nämlich ein ganz normales Beenden des Programms. Gibt es eine solche ActionID vielleicht sogar, nur wurde sie bisher noch nicht bekannt gemacht? Trotz der vielen ActionID-Nummern gibt es leider noch dieses kleine Manko. Eine andere Möglichkei wäre, man könnte den Programmfenstern unterschiedliche Namen zuweisen, ist das vielleicht möglich? Edited January 22 by satipfan Quote Link to comment
Griga Posted January 22 Share Posted January 22 vor 7 Stunden schrieb satipfan: Die damals von dir vorgeschlagene Lösung basiert auf der taskkill.exe von Windows Nein. Wie kommst du da drauf? vor 7 Stunden schrieb satipfan: Nunmehr habe ich die Möglichkeit, mit 2 Instanzen zu arbeiten. Das bedeutet, es gibt 2 Fenster mit dem Namen "DVDViewer Pro". Mit dem Namen ganz bestimmt nicht. vor 7 Stunden schrieb satipfan: Mit der Arbeitsweise dieser ActonID könnte man gut leben, gäbe es eine ActionID, die das Gleiche ausführt wie der Tastendruck auf die OK-Taste der Ferndedienung im Anschluss auf die Nachfrage - nämlich ein ganz normales Beenden des Programms. Gibt es eine solche ActionID vielleicht sogar, nur wurde sie bisher noch nicht bekannt gemacht? Die Action ID für OSD OK ist laut Actions.ini 73. Allerdings funktioniert das nicht, wenn kein OSD sichtbar ist, z.B. weil der DVBViewer minimiert ist. Dann erscheint nämlich ein Windows-Meldungsfenster, das nicht auf DVBViewer-Actions reagiert. vor 7 Stunden schrieb satipfan: Eine andere Möglichkei wäre, man könnte den Programmfenstern unterschiedliche Namen zuweisen, ist das vielleicht möglich? Nein. Der Beschreibung zu dem von mir angegebenen Tool ist aber zu entnehmen, dass du den Empfänger der Botschaft auch über den Prozessnamen festlegen kannst, z.B. SendMessage /processname:DVBViewer.exe /message:22 /wparam:1 /lparam:0 Wenn du die DVBViewer.exe der zweiten Instanz in DVBViewer2.exe umbenennst, kannst du die Instanzen auf diese Weise separat ansprechen. Quote Link to comment
Webturtle Posted January 22 Share Posted January 22 Hallo, ich habe eine ähnliche Frage. Der DVBViewer Pro und der DVBViewer GE haben denselben Namen in der Titelzeile des Programmfensters, nämlich "DVBViewer". Wenn ich mit einem AutoHotkey Script darin eine Aktion ausführen will, hängt es vom Zufall ab, welches Fenster das aktive ist, in dem die Aktion ausgeführt wird. Früher hatte ich mal die Programmdatei des GE in DVBViewerGE.exe umbenannt, aber das hat irgendwie zu Problemen geführt. Was könnte man machen, um nur den Pro anzusprechen? Viele Grüße Webturtle Quote Link to comment
Griga Posted January 23 Share Posted January 23 vor 7 Stunden schrieb Webturtle: Was könnte man machen, um nur den Pro anzusprechen? Nichts, solange die Programme über ihren Fenstertitel angesprochen werden. Ob AutoHotkey alternative Möglichkeiten bietet, weiß ich nicht. 1 Quote Link to comment
Webturtle Posted January 23 Share Posted January 23 Hallo Griga, vielen Dank für die Info. Normalerweise wird das Programm wohl über das Fenster angesprochen. Ich werde wohl bei Gelegenheit mal nachsehen, ob es auch andere Möglichkeiten gibt. Viele Grüße Webturtle Quote Link to comment
Webturtle Posted January 24 Share Posted January 24 (edited) Hallo, laut AutoHotkey-Hilfe gibt es noch andere Parameter zum Aufrufen eines Fensters: Spoiler Verschiedene Befehle, Funktionen und Kontrollanweisungen haben einen FensterTitel-Parameter, mit dem bestimmt werden kann, welche Fenster einbezogen werden sollen. Dieser Parameter kann der Titel des Fensters (teilweise oder vollständig) sein, und/oder sonstige Kriterien, die auf dieser Seite beschrieben werden. Kurzübersicht: Titel Übereinstimmungsverhalten A Das aktive Fenster ahk_class Fensterklasse ahk_id Eindeutige ID/HWND ahk_pid Prozess-ID ahk_exe Prozessname/-pfad ahk_group Fenstergruppe Mehrere Kriterien (Alles leer) Zuletzt Gefundenes Fenster Übereinstimmungsverhalten SetTitleMatchMode kontrolliert, wie der angegebene Titel (teilweise oder vollständig) mit den Titeln anderer Fenster verglichen werden soll. Je nach Einstellung kann FensterTitel ein exakter Titel sein, ein Präfix enthalten, eine im Titel vorkommende Zeichenkette sein oder ein RegEx-Suchmuster sein. Diese Einstellung bestimmt auch, ob das ahk_class- und ahk_exe-Kriterium als RegEx-Suchmuster interpretiert werden soll. Fenstertitel sind Groß-/Kleinschreibung-sensitiv, es sei denn, man benutzt den i)-Modifikator in einem RegEx-Suchmuster. Versteckte Fenster werden nur erkannt, wenn DetectHiddenWindows eingeschaltet ist; mit Ausnahme von WinShow, das versteckte Fenster immer erkennen kann. Falls mehrere Fenster mit FensterTitel und sonstigen Kriterien übereinstimmen, wird das oberste übereinstimmende Fenster verwendet. Wenn das aktive Fenster mit den Kriterien übereinstimmt, wird es üblicherweise bevorzugt, weil sich dieses Fenster für gewöhnlich über allen anderen Fenstern befindet. Gibt es neben dem aktiven Fenster auch eine Übereinstimmung mit einem Immer-im-Vordergrund-Fenster, wird dieses stattdessen verwendet. A (Aktives Fenster) Verwenden Sie den Buchstaben A für FensterTitel und lassen Sie die anderen drei Fensterparameter (FensterText, IgnoriereTitel und IgnoriereText) weg, um mit dem aktiven Fenster zu agieren. Das folgende Beispiel ermittelt und meldet die HWND-Nummer (eindeutige ID) des aktiven Fensters: MsgBox % WinExist("A") Das folgende Beispiel erstellt einen Hotkey, der gedrückt werden kann, um das aktive Fenster zu maximieren: #Up::WinMaximize, A ; WIN+NACH-OBEN ahk_-Kriterien Geben Sie eines oder mehrere der folgenden ahk_-Kriterien an (optional zusätzlich zum Titel eines Fensters). Ein ahk_-Kriterium besteht immer aus einem ahk_-Schlüsselwort und seinem Kriteriumwert, beide getrennt mit null oder mehr Leer- oder Tabulatorzeichen. Zum Beispiel repräsentiert ahk_class Notepad ein Texteditor-Fenster. Das ahk_-Schlüsselwort und sein Kriteriumwert müssen nicht zwingend mit Leer- oder Tabulatorzeichen voneinander getrennt sein. Dies ist vorwiegend nützlich, wenn ahk_-Kriterien als Ausdrücke in Kombination mit Variablen angegeben werden. Sie könnten z. B. "ahk_pid" PID anstelle von "ahk_pid " PID angeben. In allen anderen Fällen wird jedoch empfohlen, mindestens ein Leer- oder Tabulatorzeichen als Trennung zu verwenden, um die Lesbarkeit zu verbessern. ahk_class (Fensterklasse) Verwenden Sie ahk_class Klassenname in FensterTitel, um ein Fenster anhand seiner Fensterklasse zu identifizieren. Eine Fensterklasse ist eine Reihe von Attributen, die das System als Vorlage zum Erstellen eines Fensters verwendet. Das heißt, dass der Klassenname des Fensters kennzeichnet, welche Art von Fenster es ist. Eine Fensterklasse kann via Window Spy aufgedeckt oder über WinGetClass abgerufen werden. Falls der RegEx-Titelübereinstimmungsmodus aktiv ist, akzeptiert Klassenname einen regulären Ausdruck. Das folgende Beispiel aktiviert ein Konsolenfenster (z. B. cmd.exe): WinActivate, ahk_class ConsoleWindowClass Das folgende Beispiel macht dasselbe wie oben, verwendet aber einen regulären Ausdruck (beachten Sie, dass der RegEx-Titelübereinstimmungsmodus vorher eingeschaltet werden muss, damit es funktioniert): WinActivate, ahk_class i)^ConsoleWindowClass$ ahk_id (Eindeutige ID / HWND) Verwenden Sie ahk_id HWND in FensterTitel, um ein Fenster oder ein Steuerelement anhand seiner eindeutigen ID zu identifizieren. Jedes Fenster oder Steuerelement hat eine eindeutige ID, auch bekannt als HWND (Abkürzung für "Handle to Window"). Diese ID kann zur Identifizierung des Fensters oder Steuerelements verwendet werden, selbst wenn sich dessen Titel ändert. Die ID eines Fensters wird üblicherweise via WinExist() oder WinGet abgerufen. Die ID eines Steuerelements wird üblicherweise via ControlGet Hwnd, MouseGetPos oder DllCall() abgerufen. Außerdem funktioniert das ahk_id-Kriterium auch bei Steuerelementen, die versteckt sind; das heißt, dass die Einstellung von DetectHiddenWindows bei Steuerelementen keine Rolle spielt. Das folgende Beispiel aktiviert ein Fenster anhand einer eindeutigen ID, die in VarMitID gespeichert ist: WinActivate, ahk_id %VarMitID% ahk_pid (Prozess-ID) Verwenden Sie ahk_pid PID in FensterTitel, um ein Fenster zu identifizieren, das zu einem bestimmten Prozess gehört. Der Prozessidentifikator (PID) wird üblicherweise per WinGet, Run oder Process ermittelt. Die ID des Prozesses eines Fensters kann via Window Spy aufgedeckt werden. Das folgende Beispiel aktiviert ein Fenster anhand einer Prozess-ID, die in VarMitPID gespeichert ist: WinActivate, ahk_pid %VarMitPID% ahk_exe (Prozessname/-pfad) [v1.1.01+] Verwenden Sie ahk_exe ProzessNameOderPfad in FensterTitel, um ein Fenster zu identifizieren, das zu einem beliebigen Prozess mit dem angegebenen Namen oder Pfad gehört. Während das ahk_pid-Kriterium auf einen bestimmten Prozess beschränkt ist, berücksichtigt das ahk_exe-Kriterium alle Prozesse, deren Namen oder vollständigen Pfade mit einer bestimmten Zeichenkette übereinstimmen. Falls der RegEx-Titelübereinstimmungsmodus aktiv ist, akzeptiert ProzessNameOderPfad einen regulären Ausdruck, der mit dem vollständigen Pfad des Prozesses übereinstimmen muss. Ansonsten akzeptiert es einen nicht-Groß-/Kleinschreibung-sensitiven Namen oder vollständigen Pfad; zum Beispiel bezieht sich ahk_exe notepad.exe auf ahk_exe C:\Windows\Notepad.exe, ahk_exe C:\Windows\System32\Notepad.exe und andere Variationen. Der Name des Prozesses eines Fensters kann via Window Spy aufgedeckt werden. Das folgende Beispiel aktiviert ein Texteditor-Fenster anhand seines Prozessnamens: WinActivate, ahk_exe notepad.exe Das folgende Beispiel macht dasselbe wie oben, verwendet aber einen regulären Ausdruck (beachten Sie, dass der RegEx-Titelübereinstimmungsmodus vorher eingeschaltet werden muss, damit es funktioniert): WinActivate, ahk_exe i)\\notepad\.exe$ ; Stimmt mit den Namensteil des vollständigen Pfads überein. ahk_group (Fenstergruppe) Verwenden Sie ahk_group GruppeName in FensterTitel, um ein oder mehrere Fenster zu identifizieren, die den Regeln einer zuvor definierten Fenstergruppe entsprechen. WinMinimize, WinMaximize, WinRestore, WinHide, WinShow, WinClose und WinKill werden mit allen Fenstern der Gruppe agieren. Andere fensterspezifische Befehle, Funktionen und Kontrollanweisungen wie WinActivate, WinExist() und IfWinExist agieren hingegen nur mit dem obersten Fenster einer Gruppe. Das folgende Beispiel aktiviert jedes Fenster, das den Kriterien einer Fenstergruppe entspricht: ; Definiert die Gruppe: Windows-Explorer-Fenster GroupAdd, Explorer, ahk_class ExploreWClass ; Unbenutzt in Vista und höher GroupAdd, Explorer, ahk_class CabinetWClass ; Aktiviert jedes Fenster, das mit den obigen Kriterien übereinstimmt WinActivate, ahk_group Explorer Mehrere Kriterien Im Gegensatz zum ahk_group-Kriterium (das die Suche erweitert) kann die Suche durch Angabe von mehr als ein Kriterium innerhalb des FensterTitel-Parameters eingeschränkt werden. Im folgenden Beispiel wartet das Skript auf ein Fenster, dessen Titel Meine Datei.txt enthält und dessen Klasse Notepad ist: WinWait Meine Datei.txt ahk_class Notepad WinActivate ; Aktiviert das zuvor gefundene Fenster. Beim Verwenden dieser Methode sollte der Text des Titels (falls gewünscht) zuerst aufgelistet werden, gefolgt von einem oder mehreren zusätzlichen Kriterien. Die Kriterien sollten jeweils mit genau einem Leer- oder Tabulatorzeichen getrennt werden (jedes weitere Leer- oder Tabulatorzeichen wird als direkt geschriebener Teil des vorherigen Kriteriums angesehen). Das ahk_id-Kriterium kann mit anderen Kriterien kombiniert werden, um den Titel, die Klasse oder andere Attribute des Fensters zu testen: MouseGetPos,,, id if WinExist("ahk_class Notepad ahk_id " id) MsgBox Der Mauszeiger befindet sich über dem Texteditor. Zuletzt Gefundenes Fenster Das zuletzt gefundene Fenster ist das Fenster, das zuletzt von IfWinExist, IfWinNotExist, WinExist(), IfWinActive, IfWinNotActive, WinActive(), WinWaitActive, WinWaitNotActive oder WinWait gefunden wurde. Dieses Fenster kann die Erstellung und Pflege von Skripten erleichtern, da es verhindert, für jeden Befehl, jede interne Funktion oder jede Kontrollanweisung, der/die mit Fenstern agiert, den FensterTitel und FensterText des Zielfensters angeben zu müssen. Zudem verbessert das die Leistung der Skripte, weil das Zielfenster, nachdem es gefunden wurde, nicht nochmal gesucht werden muss. Das zuletzt gefundene Fenster kann von allen fensterspezifischen Befehlen, internen Funktionen und Kontrollanweisungen, außer WinWait, WinActivateBottom, GroupAdd, WinGet Count und WinGet List, verwendet werden. Um es zu nutzen, lassen Sie einfach alle vier Fensterparameter weg (FensterTitel, FensterText, IgnoriereTitel und IgnoriereText). Jeder Thread behält seinen eigenen Wert des zuletzt gefundenen Fensters. Soll heißen: Wenn der aktuelle Thread von einem anderen unterbrochen wird, hat der ursprüngliche Thread bei Wiederaufnahme immer noch seinen originalen Wert des zuletzt gefundenen Fensters, nicht den des unterbrechenden Threads. Wenn das zuletzt gefundene Fenster ein verstecktes GUI-Fenster ist, kann es auch bei ausgeschaltetem DetectHiddenWindows verwendet werden. Das wird oft in Verbindung mit Gui +LastFound benutzt. Das folgende Beispiel öffnet den Texteditor, wartet, bis er existiert, und aktiviert ihn: Run Notepad WinWait Unbenannt - Editor WinActivate ; Verwendet das von WinWait gefundene Fenster. Das folgende Beispiel aktiviert und maximiert das Texteditor-Fenster, das mit der WinExist-Funktion darüber gefunden wurde: if WinExist("Unbenannt - Editor") { WinActivate ; Verwendet das von WinExist gefundene Fenster. WinMaximize ; Das gleiche wie oben. Send, Dies ist ein Text.{Enter} return } Das folgende Beispiel kehrt via Return zurück, wenn der Taschenrechner nicht existiert, ansonsten wird der Taschenrechner aktiviert und an eine neue Position verschoben: if not WinExist("Rechner") return else { WinActivate ; Verwendet das von WinExist gefundene Fenster. WinMove, 40, 40 ; Das gleiche wie oben. return } ahk_exe (Prozessname/-pfad) wäre wohl am ehesten ein Ersatz für den Fensternamen, da dieses Kriterium unabhängig vom konkreten Aufruf des Programmes und von momentanen Systemzustand wäre. Ich werde es gelegentlich mal ausprobieren. Viele Grüße Webturtle Edited January 24 by Webturtle Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.