Tastendruckzähler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Sonntag 5. April 2009, 21:57

Es gab mal für Windows ein Programm namens "Pulse", das alle Tastendrucks mitgezählt hat, die man so täglich macht. Das fand ich ziemlich interresant und habs mal probiert nachzubauen. Jetzt dachte ich baue ich das so, das ich ein Symbol mache, das oben in der Leiste ist, und bei doppelklick es sich ein Fenster öffnet, bei dem steht wie oft bis jetzt gedrückt wurde. Alles kein Problem. Außer das mit dem Tastensignal, will nicht so recht. Mit einem normalen Widget Signal geht es nicht, da ja dann das Fenster beziehungsweise das Widget aktiv sein muss. Mit raw_input oder so irgendetwas ist auf umständlich beziehungsweise geht auch nicht, wenn das Fenster oder die Konsole nicht aktiv ist.

Weiß jemand eine Lösung, mit dem ich ein Tastendruck bemerkbar machen kann? Also es soll eben so ein Art Deamon sein, das man nichts sieht außer das Symbol in der Leiste aber trotzdem die Tasten gezählt werden.

Schon mal Danke
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 6. April 2009, 07:17

Hallo gugugs!

Auf das hier http://timgolden.me.uk/python/win32_how ... tkeys.html will dich bremer hinweisen.

Und hier sind noch zwei Links, in denen ebenfalls systemweit Hotkeys abgefangen werden:
- http://www.python-forum.de/post-54408.html#54408
- http://www.python-forum.de/topic-18127.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Montag 6. April 2009, 17:10

Danke

Ich hab mich allerdings jetzt nun mal ein bisschen an Xlib probiert. Doch in der Documentation von der Seite, verstehe ich nicht so wirklich viel. Wie kann ich denn mit Xlib einfach nur jeden Tastendruck abfangen und anzeigen lassen? Ich finde in der Documentation ist das ein bisschen kompliziert erklärt.

Danke
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 6. April 2009, 18:29

gugugs hat geschrieben:bisschen an Xlib probiert
Hallo gugugs!

"xlib" und "oben in der Leiste"? Sprichst du von Linux oder doch von Windows?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Montag 6. April 2009, 19:09

Oh, sry, ich hätte vielleicht erwähnen sollen, das ich von linux spreche^^

Weiß jemand wie ich mit Xlib einen einfachen Tastendruck abfange?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 6. April 2009, 19:21

gugugs hat geschrieben:Weiß jemand wie ich mit Xlib einen einfachen Tastendruck abfange?
Keine Ahnung von der Xlib. Ich habe mich zwar mal mit python-xlib gespielt, aber die wird nicht weiterentwickelt. Ich hatte mir mal vorgenommen, irgendwie mit ctypes auf die Xlib zuzugreifen, aber das hat sich verlaufen.

Siehe: http://python-xlib.sourceforge.net/

Das hier ist der Code, den ich damals irgendwoher hatte. Aber ob er funktioniert, weiß ich jetzt nicht mehr.

Code: Alles auswählen

from Xlib.display import Display
from Xlib import X


def handle_event(aEvent):
   keycode = aEvent.detail
   print keycode
   if aEvent.type == X.KeyPress:
      print keycode

def main():
   # current display
   disp = Display()
   root = disp.screen().root

   # we tell the X server we want to catch keyPress event
   root.change_attributes(event_mask = X.KeyPressMask)

   
   keys = [disp.keysym_to_keycode(ord(s)) for s in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]
   
   print keys

   for keycode in keys:
      root.grab_key(
         keycode, 
         X.AnyModifier, 
         1,
         X.GrabModeAsync, 
         X.GrabModeAsync
      )

   while 1:
      event = root.display.next_event()
      handle_event(event)

if __name__ == '__main__':
   main()
Aber versuche es doch mal mit diesem Beispiel: http://www.python-forum.de/post-54408.html#54408

Wenn das unter Linux (Gnome) funktioniert, dann brauchst du nur noch alle abzufangenen Tasten registrieren. Und ein Symbol in die "Leiste" zu legen, ist mit wxPython auch kein Problem. Die wxPython-Demo sollte dir zeigen, wie das funktioniert.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Montag 6. April 2009, 20:05

Also ich finde das mit Xlib sehr interessant, aber ich verstehe das ganze Prinzip noch nicht so wirklich. Die einzigste Anleitung die ich gefunden habe ist diese hier http://python-xlib.sourceforge.net/doc/ ... ib_11.html
und die lässt meiner Meinung nach sehr zu wünschen übrig. Ansonsten, hab ich bis jetzt nur komplexe Beispiele gesehen. Wär wirklich super wenn mir vllt jemand helfen könnte, das ein bisschen besser zu verstehen.

Danke schon mal

edit: also ich weiß ja nicht, ob ich nicht richtig suche, aber es gibt echt nirgends ein tutorial das etwas zu xlib erklärt. Wie soll jemand, der damit noch nicht viel gemacht hat, denn irgendeinen Zusammenhang verstehen???
BlackJack

Dienstag 7. April 2009, 07:14

@gugugs: Das Python-Modul ist soweit ich das sehe nur eine dünne Schicht über der "echten" xlib, also sollte man dafür nach Informationen suchen.
Benutzeravatar
snafu
User
Beiträge: 5644
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 7. April 2009, 09:18

Hier hat mal jemand was in C++ gemacht. Schau dir mal die Funktion `KeyGrabber::grabKeys()` an. Ansonsten hat die Xlib noch XGrabKeyboard(). Vielleicht hilft dir das ja weiter...
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5644
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 7. April 2009, 11:20

Ich hab hier mal nen ersten Ansatz in Python gemacht. Sachen wie <Shift> und <Alt> werden dabei noch nicht beachtet. Außerdem kann man nichts mehr woanders eingeben (schätze, das Event muss irgendwie weitergeleitet werden), aber vielleicht hilft es dir für den Anfang. :)
shcol (Repo | Doc | PyPi)
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Dienstag 7. April 2009, 18:28

Ja, vielen Dank für die Hilfe, werde mal schauen
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Dienstag 14. April 2009, 15:03

Hallo, ich möchte das Thema noch einmal auffrischen, da ich noch eine Frage dazu habe.

Mit xlib hab ich das nun hinbekommen, also in Linux, auch wenn es nicht so wirklich einfach war.

Nun möchte ich aber das ganze auch in Windows hinbekommen.

Um es noch einmal ganz kurtz zu erklären, ich spreche nicht von Hotkeys, sondern ich hätte es gern so, das sobald eine Taste gedrückt wird, egal welche, das dann etwas ausgeführt wird, also ein Funktione oder irgendwas, das ist unwichtig. Ich will es nur so hinbekommen, das ein Tastendruck erkannt wird.

Habe schon ein bisschen mit win32api und mit pywin32 getestet, habe es aber nicht so wirklich hinbekommen.

Danke, falls mir jemand auf die Sprünge helfen könnte
Benutzeravatar
snafu
User
Beiträge: 5644
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 14. April 2009, 23:19

Nur so aus Interesse: Kannste deinen erfolgreichen Versuch unter Linux hier reinposten? :)
shcol (Repo | Doc | PyPi)
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Mittwoch 15. April 2009, 21:14

Unter Linux hab ich nun die Vorlage von der XLib Documentation so gerändert, das sie meinen Wünschen entspricht. Das Ergebniss sieht so aus:

Code: Alles auswählen

def callback(reply):
	data=reply.data
	while len(data):
		event, data=rq.EventField(None).parse_binary_value(data, recorddpy.display, None, None)
		if event.type in [X.KeyPress]:
			print "Ich bin ein Tastendruck"

ctx=recorddpy.record_create_context(
		0,
		[record.AllClients],
		[{
				'core_requests': (0, 0),
				'core_replies': (0, 0),
				'ext_requests': (0, 0, 0, 0),
				'ext_replies': (0, 0, 0, 0),
				'delivered_events': (0, 0),
				'device_events': (X.KeyPress, X.MotionNotify),
				'errors': (0, 0),
				'client_started': False,
				'client_died': False,
		}])
recorddpy.record_enable_context(ctx, callback)
Falls sich jemand für das ganze Programm interessiert, kann er sich bei mir per PN melden. Ist ganz lustig.

Wie gesagt es ist ein Art Daemon, der sich in die leiste setzt jeden Tastendruck mitzälht und bei klick einen Kalender anzeigt und alle Tastendruckzählungen pro Tag in eine List setzt.

Programmiert ist es mit natürlich Python, GTK+, slite3 und XLib
Antworten