Keyboard Hook oder alternative für Linux

Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Keyboard Hook oder alternative für Linux

Beitrag von corpsman »

Guten morgen allerseits,

Ich versuche seit gut 2 Jahren eine Screensaver für Linux zu schreiben, und komme einfach nicht weiter. Daher habe ich nun einen etwas "Kreativeren" Ansatz gewählt.

Das Problem an meinem Screensaver ist nicht die Funktion des Screensavers diese habe ich schon (hier) sondern, dass Linux es anscheinend nicht richtig schafft meine Anwendung zu starten. Egal was ich anstelle ich sehe immer "Nichts" = einen schwarzen Monitor, wo doch eigentlich mein Screensaver zu sehen sein sollte ( ich nutze KDE ).

Der Screensaver wird bei mir ohne Passwort betrieben und soll auch sonst nichts weiter tun als eben diese grünen Zeichen anzeigen. Also habe ich mir gedacht, deaktiviere ich einfach alle Screensaver im System und schreibe eine Anwendung, welche Screensaver spielt.

Dazu läuft meine Anwendung permanent ( quasi im Autostart gestartet und mit System shutdown beendet ) und überwacht mich. Wenn ich die Maus 1 min lang nicht bewege ( in der Zip File sinds nur 10sek ) dann wird das Fenster gezeigt.

Mein Problem ist nun aber, dass ich sehr viel Programmiere, und das ohne Maus, also muss ich auch erkennen, dass ich eine Taste gedrückt habe und meinen "timer" resetten. Die Frage ist nun also, wie bekomme ich unter Linux mit, dass eine Taste gedrückt wurde ( egal welche ).

Da ich auch ab und zu ein Filmchen ansehe, und der Screensaver hier natürlich auch nicht kommen darf, muss ich zusätzlich noch in der Lage sein heraus zu bekommen ob ein Fenster ( z.B. VLC oder SMPlayer ) existiert, dass es geht ist mir klar, nur wie weis ich noch nicht.

Habt ihr ein paar Ideen dazu ?

Gruß

Corpsman
Dateianhänge
screeny0.zip
1. Versuch, der die Bewegungen der Maus überwacht, es fehlt noch Tastatur und offene Fenster ..
(2.42 KiB) 74-mal heruntergeladen
--
Just try it

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Keyboard Hook oder alternative für Linux

Beitrag von theo »

Das ist Xlib Programmierung.

Für den Keyboard Hook vllt. XGrabKey auf dem Root Window ausführen. http://tronche.com/gui/x/xlib/input/XGrabKey.html

Für die Fensterliste habe ich hier mal was gemacht: http://www.theo.ch/lazarus/winlist.zip

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Keyboard Hook oder alternative für Linux

Beitrag von corpsman »

einen Xscreen hatte ich auch schon versucht, vergebens :(

Danke für die beiden Anderen Links ich werde es versuchen und dann bescheid geben..
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Keyboard Hook oder alternative für Linux

Beitrag von corpsman »

So, ich habe mich nun also hingesetzt und es ausprobiert.

Das mit dem Hook hab ich nicht hinbekommen, der rest funktioniert aber wunderbar.

Habe meinen Screensaver nun erst mal auf 60 Sekunden eingestellt und schaue mal wie gut ich damit klar komme, dass es keinen Hook gibt.

Die CPU Load, wenn der Screensaver nicht Aktiv ist, ist zumindest mit "top" und "system monitor" nicht mehr wirklich messbar. Wenn er aktiv ist, dann braucht er ca. 3-4 % CPU Load und 10MB Ram. Das ist es mir wert *g*.

Damit ich es auf meine HP stellen kann (natürlich OpenSource), brauche ich aber noch deine Erlaubniss Theo, wenn du mir diese bitte zukommen lassen könntest, oder hier posten das reicht auch.

Und falls das hier noch irgendwer liest, und weis wie man meinen "Hook" den ich brauche einfach und ohne große CPU Load hinbekommt. So kann er sich gerne bei mir melden *g*.
--
Just try it

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Keyboard Hook oder alternative für Linux

Beitrag von theo »

corpsman hat geschrieben:Damit ich es auf meine HP stellen kann (natürlich OpenSource), brauche ich aber noch deine Erlaubnis


Jaja, haste.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Keyboard Hook oder alternative für Linux

Beitrag von corpsman »

Also,

Hab das nun mal ausprobiert, einfach so nur die Maus zu überwachen ist tatsächlich zu wenig, da wenn man viel Tippt ( z.B. dieser Text ) es durchaus schon mal vorkommt, dass ich länger tippe als 1min.

Der Code unten funktioniert auf Windows wunderbar ( mein system das ich morgens zum Testen habe ), Unter Linux leider nicht :(

Wie ich rausgefunden habe ist hier "GetKeyState" immer 0.
Mit SDL hab ichs auch schon versucht, doch da schaffe ich es nicht ein mal Key Events in meiner eigenen Anwendung zu bekommen... :(


Code: Alles auswählen

{$IFDEF HOOK_KeyBoard}
  cc[0].c := VK_E;
  cc[1].c := VK_N;
  cc[2].c := VK_I;
  cc[3].c := VK_S;
  cc[4].c := VK_R;
  cc[5].c := VK_A;
  cc[6].c := VK_T;
  cc[7].c := VK_D;
  cc[8].c := VK_H;
  cc[9].c := VK_O;
  For i := low(cc) To high(cc) Do Begin
    cc[i].os := GetKeyState(cc[i].c);
  End;
..
  For i := low(cc) To high(cc) Do Begin
    j := GetKeyState(cc[i].c);
    If j <> cc[i].os Then Begin
      cc[i].os := j;
      FlastActionTime := GetTickCount;
    End;
  End;
{$ENDIF}


[Edit]
Hier habe ich ein Hotkey Sample von mir gefunden, dass ja ansich auch gehen könnte. Das Problem ist ich bekomme beim Beenden immer eine Sigsev...
[Edit2]

Also die sigsev habe ich raus gekriegt, und sogar das Keyboard Grab "XGrabKeyboard" hinbekommen. Das Problem ist nun, aber das meine Anwendung alle Tastatur Eingaben "Fängt" und löscht. Genau das gleiche passiert mit grabkey, dann eben nur mit vereinzelten Tasten -> Was mus man machen damit die Tasten wieder an das system weiter geleitet werden ?

[Edit3]
Nachdem ich das mit dem Hook einfach nicht hinbekomme, habe ich euch Hier mal den Source ohne Hook mit angehängt. Die Version funktioniert auch schon nicht schlecht...
--
Just try it

Antworten