Seite 1 von 1

Tastendruckzähler

Verfasst: Sonntag 5. April 2009, 21:57
von gugugs
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

Verfasst: Montag 6. April 2009, 02:59
von bremer

Verfasst: Montag 6. April 2009, 07:17
von gerold
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
:-)

Verfasst: Montag 6. April 2009, 17:10
von gugugs
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

Verfasst: Montag 6. April 2009, 18:29
von gerold
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
:-)

Verfasst: Montag 6. April 2009, 19:09
von gugugs
Oh, sry, ich hätte vielleicht erwähnen sollen, das ich von linux spreche^^

Weiß jemand wie ich mit Xlib einen einfachen Tastendruck abfange?

Verfasst: Montag 6. April 2009, 19:21
von gerold
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
:-)

Verfasst: Montag 6. April 2009, 20:05
von gugugs
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???

Verfasst: Dienstag 7. April 2009, 07:14
von BlackJack
@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.

Verfasst: Dienstag 7. April 2009, 09:18
von snafu
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...

Verfasst: Dienstag 7. April 2009, 11:20
von snafu
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. :)

Verfasst: Dienstag 7. April 2009, 18:28
von gugugs
Ja, vielen Dank für die Hilfe, werde mal schauen

Verfasst: Dienstag 14. April 2009, 15:03
von gugugs
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

Verfasst: Dienstag 14. April 2009, 23:19
von snafu
Nur so aus Interesse: Kannste deinen erfolgreichen Versuch unter Linux hier reinposten? :)

Verfasst: Mittwoch 15. April 2009, 21:14
von gugugs
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

Verfasst: Freitag 17. April 2009, 22:47
von gugugs
So hab nun endlich etwas gefunden, also unter Windows klappt es gut damit:

http://pyhook.wiki.sourceforge.net/pyHook_Tutorial