Jump to content

Aufnahme per Kommandozeile beenden


satipfan

Recommended Posts

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?

Link to comment

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 by Griga
Link to comment

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.

Link to comment

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 by nuts
Link to comment
  • 7 years later...

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 by satipfan
Link to comment
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.

 

Link to comment

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

Link to comment
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.

 

  • Thanks 1
Link to comment

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

Link to comment

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 by Webturtle
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...