Jump to content

DVBViewer Pro 7.1.2.1 sendet CTRL+Escape an Programme im Vordergrund bei Tastendruck auf Fernbedienung


delphifreak

Recommended Posts

Hi,

 

ich habe seit einer Weile ein seltsames Problem mit dem DVBViewer Pro. Seit einem Update das ich in letzter Zeit durchgeführt habe (ich vermute von 7.0.2.0 auf 7.1.0.0, aber vielleicht fällt mir das auch jetzt erst auf) sendet der DVBViewer Pro die Tastenkombination CTRL+Escape an die Applikation welche gerade im Vordergrund ist, sobald ich irgendeine Taste auf der Infrarot-Fernbedienung drücke. Das Verhalten kann ich auch in der aktuellen Version 7.1.2.1 reproduzieren und das egal ob ich das HCWRemote oder das Universal Remote Plugin einsetze. Es scheint dabei irrelevant zu sein, ob die Taste einer Funktion zugeordnet ist oder nicht. Reproduzieren ist für mich sehr einfach, z.B. diese Webseite öffnen: https://w3c.github.io/uievents/tools/key-event-viewer.html Cursor in das Eingabefeld setzen und eine beliebige Taste auf der Fernbedienung drücken. Dann tauchen bei mir dort zwei neue Zeilen auf, je eine für CTRL+Escape down und eine für CTRL+Escape up. Dies ist ziemlich nervig in Applikationen die auf den Druck der Tasten reagieren (vorallem Computerspiele), daher würde ich das Verhalten gerne abstellen.

 

Ein Debugger zeigt mir, dass hierzu die WinAPI Funktion keybd_event mit den Parametrisierungen keybd_event(VK_LCONTROL, 1, 0, 0) und keybd_event(VK_LCONTROL, 1, KEYEVENTF_KEYUP, 0) zum Einsatz kommt. Die "1" als zweiter Parameter ist der Scancode für die Escape-Taste.

 

Spoiler

Um das Support.zip zu erstellen funktionierte bei mir der "DVBViewer Pro (Debug Mode)" Link im Startmenü leider nicht. Aus irgendeinem Grund beendet sich der DVBViewer nach "Loading Favorites...". Ich habe daher zum Erstellen des Zips den DVBViewer ohne den -vanilla switch gestartet, so startete der DVBViewer zumindest (also: "DVBViewer.exe -debug -osddebug" anstatt "DVBViewer.exe -debug -vanilla -osddebug"). Ich hoffe das funktioniert für euch trotzdem.

 

TV Karte: Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR)

TV Karte Treiberversion: 1.59.37308.0 / 04.11.2019

Graphikkarte: Nvidia GeForce RTX 3080

Graphiktreiber: 497.29 / DCH

 

Danke schonmal!

support.zip

Link to comment

Hauppauge installiert gerne einen HID-Treiber (Human Interface Device) für seine Fernbedienungen, der dann im Hintergrund allerlei merkwürdige Sachen macht. Bei mir fuhr der PC immer runter, wenn ich die Power-Taste gedrückt habe. Schau mal im Gerätemanager, ob sich dort so etwas findet, und deinstalliere gegebenfalls diesen Treiber. Der DVBViewer braucht ihn nicht.

 

Link to comment

Sorry, es ist doch der DVBViewer, wie eine Überprüfung im Quellcode ergab. Heute morgen kam die Erinnerung wieder. Ursache ist eine Änderung im DVBViewer 7.1.0:

 

Am 24.4.2021 um 17:41 schrieb hackbart:
  • Ergänzt: Fernbedienung: Ein simulierter Tastendruck bei jedem Fernbedienungstastendruck signalisiert die Anwesenheit eines Benutzers, so dass Windows aus dem Abwesenheitsmodus zurückkehrt (siehe hier).

 

vor 9 Stunden schrieb delphifreak:

Die "1" als zweiter Parameter ist der Scancode für die Escape-Taste.

 

Eigentlich sollte nur ein Drücken und Loslassen der linken Strg-Taste simuliert werden. Wo ich die 1 herhatte, weiß ich nicht mehr. Laut dieser Tabelle wäre eher 29 angebracht, was im Keyboard Event Viewer auch den gewünschten Output ergibt. Ich werde das mal entsprechend ändern.

 

Edited by Griga
Korrektur
Link to comment

Danke für die schnelle Antwort!

5 hours ago, Griga said:

Laut dieser Tabelle wäre eher 29 angebracht, was im Keyboard Event Viewer auch den gewünschten Output ergibt. Ich werde das mal entsprechend ändern.

Das würde die Situation verbessern (ohne Escape öffnen sich zumindest keine Menüs in Spielen), aber das Problem nicht komplett lösen (CTRL ist in Computerspielen oft das Keybinding für "hinknien/in die Hocke gehen/hinlegen"). Daher erscheint mir der simulierte Tastendruck zur Lösung des zitierten Bugs eher ein Workaround als eine Lösung zu sein. Mir fällt auf Anhieb aber auch keine bessere Lösung ein, ggf. könnte man mal SetThreadExecutionState mit ES_SYSTEM_REQUIRED und/oder ES_DISPLAY_REQUIRED probieren. Alternativ könnte man versuchen den Tastendruck nur dann zu simulieren, wenn der Computer auch tatsächlich im Away-Mode ist, anstatt dies bei jedem Fernbedienungstastendruck zu tun. Und wenn all dies nicht möglich ist, wäre ich um eine Option dankbar, mit der ich die Tastenemulation deaktivieren kann.

Link to comment
vor 4 Stunden schrieb delphifreak:

Das würde die Situation verbessern

 

Dann werde ich es erst mal so lassen. Wichtig war dein Hinweis auf Strg+Esc, da das so nicht beabsichtigt war.

 

vor 4 Stunden schrieb delphifreak:

Daher erscheint mir der simulierte Tastendruck zur Lösung des zitierten Bugs eher ein Workaround als eine Lösung zu sein.

 

Intention ist, dass die Fernbedienung ebenso wie die Tastatur Windows allgemeingültig Benutzeranwesenheit signalisiert, unabhängig von den Voraussetzungen (Abwesenheitsmodus oder was auch immer), so dass es auch weitere (unbekannte) Szenarien abdeckt. Dies stellt insbesondere in HTPC-Umgebungen sicher, dass der Anwender nicht vom Sofa aufstehen und am PC eine Taste drücken/die Maus bewegen muss, um etwas in die Gänge zu setzen, das Windows bei fehlender Benutzeraktivität stilllegt.

 

Leider bietet Windows kein API, um Benutzeranwesenheit direkt zu signalisieren, ohne sie zu simulieren. Also bleibt nur ein Tastendruck oder eine Mausbewegung um einen Pixel und zurück - das wäre noch eine Alternative. Ob sie stört, kannst du leicht testen: Sorge dafür, dass im DVBViewer Video läuft, dass er nicht minimiert ist und Optionen -> Allgemein -> Bildschirm-Abschaltung und -Schoner verhindern einen Haken hat. Dann passiert das alle 45 Sekunden (hauptsächlich wegen Schonern, für die Verhinderung der Displayabschaltung würde ES_DISPLAY_REQUIRED reichen).

 

Deine Nutzungsweise (Spiel im Vordergrund, mit FB bedienter DVBViewer im Hintergrund) ist ziemlich speziell. Ich sehe keinen allgemeinen Nutzen darin, den DVBViewer dafür passend zu machen. Wenn etwas im DVBViewer implementiert wird, sollte es einen gewissen allgemeinen Wert haben, d.h. (soweit absehbar) mehrere oder relativ häufige Szenarien behandeln. Für jeden individuellen Benutzer-Anpassungswunsch eine Option bzw. zusätzliche Programmverzweigungen vorzusehen, macht den Code unübersichtlich und über kurz oder lang unwartbar. Leider gibt es im DVBViewer schon zu viele Optionen - die Sünden der Vergangenheit. Und man wird sie aus Kompatibilitätsgründen nicht mehr los, weil der DVBViewer keine Telemetrie betreibt und deshalb unklar bleibt, ob sie noch jemand benutzt oder nicht.

 

vor 4 Stunden schrieb delphifreak:

ggf. könnte man mal SetThreadExecutionState mit ES_SYSTEM_REQUIRED und/oder ES_DISPLAY_REQUIRED probieren.

 

Macht der DVBViewer bereits unter passenden Bedingungen (Aufnahme/Wiedergabe läuft). Nützt aber im Abwesenheitsmodus nichts. Da kommt man nur durch Benutzerinteraktion raus. Das System läuft sowieso, und bei ES_DISPLAY_REQUIRED stellt Windows sich taub.

 

Link to comment
21 hours ago, Griga said:

Leider bietet Windows kein API, um Benutzeranwesenheit direkt zu signalisieren, ohne sie zu simulieren.

 

In der Tat, ich habe auf die schnelle auch keine gefunden. SetThreadExecutionState mit ES_USER_PRESENT klang danach, aber das wird laut Dokumentation nicht mehr unterstützt. Vermutlich baut Microsoft darauf, dass alle HID Devices Treiber mitbringen und PoRegisterSystemState mit ES_USER_PRESENT aufrufen sobald sie betätigt werden. Nur dumm wenn man keinen HID Treiber für sein HID Gerät hat.

 

21 hours ago, Griga said:

Also bleibt nur ein Tastendruck oder eine Mausbewegung um einen Pixel und zurück - das wäre noch eine Alternative.

 

Genau. An der Stelle habe ich mich gefragt - muss es denn ein "valider" Tastendruck sein? Ich habe das mal kurz ausprobiert:

 

#include <iostream>
#include <windows.h>
#include <thread>
#include <chrono>

int main() {
    int i = 0;
    while (++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        SetThreadExecutionState(ES_AWAYMODE_REQUIRED | ES_CONTINUOUS);

        if (i % 20 == 0) {
            std::cout << i << std::endl;
        }
        if (i % 300 == 0) {
            keybd_event(0, 0, 0, 0);
            keybd_event(0, 0, KEYEVENTF_KEYUP, 0);
        }
    }
}

 

Und siehe da, mein Computer wacht auch bei Simulation einer ungültigen Taste aus dem Away-Mode auf ?. Zugegebenermaßen benutzt man dadurch die keybd_event funktion außerhalb der Spezifikationen (Parameter 1: "A virtual-key code. The code must be a value in the range 1 to 254."), aber was solls?

 

Vielleicht ist das ja eine Lösung die alle glücklich macht?

Edited by delphifreak
Link to comment

Bei einem ungültigen Tastendruck stellt sich die Frage, ob es auf allen Systemen funktioniert.

 

Wie sieht es mit einer Mausbewegung aus?

 

        mouse_event(MOUSEEVENTF_MOVE, $00000001, 0, 0, 0);
        mouse_event(MOUSEEVENTF_MOVE, $FFFFFFFF, 0, 0, 0);

 

Link to comment
32 minutes ago, Griga said:

Wie sieht es mit einer Mausbewegung aus?

 

Hm. Eine relative Mausbewegung um 1 Pixel stört in meinem Anwendungsfall vermutlich gar nicht. Zumindest sehr viel weniger als die CTRL Taste.

 

Das ist dann wohl die beste Lösung.

Link to comment
vor 2 Stunden schrieb delphifreak:

Eine relative Mausbewegung um 1 Pixel stört in meinem Anwendungsfall vermutlich gar nicht.

 

Dann probieren wir das jetzt mal. Das macht der DVBViewer ja ohnehin (siehe meinen vorletzten Post).

 

Link to comment
  • 4 weeks later...

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...