Wieder mal: Keyloggen

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

Mittwoch 3. Januar 2007, 17:24

Ich habe folgendes Problem:
Ich möchte ein Programm schreiben, dass im Hintergrund läuft, und dennoch auf bestimmte Tastenkombinationen reagiert. Ich kann also keine grafische Oberfläche nutzen. Kann mir jemand sagen, wie ich meine Idee realisieren kann?
Ich weiß das dieses Thema schon des Öfteren in diesem Forum diskutiert wurde, ich konnte jedoch keine Antwort finden.
Würde mich freuen, wenn jemand eine Antwort parat hätte.
Gruß
LordMyder
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Mittwoch 3. Januar 2007, 17:52

Schau dir das Modul msvcrt an.

Hier ein kleines Beispiel:

Code: Alles auswählen

import msvcrt
def keylogger(y=0):
   keylog=''
   while y<=1000:
      x=msvcrt.getch()
      keylog=keylog+x
      y=y+1
   print keylog
mfg

Thomas :-)
lordmyder

Mittwoch 3. Januar 2007, 18:46

Danke, genau so was habe ich gesucht! Leider habe ich immer noch ein kleines Problem. Ich habe mit deinem Beispiel etwas rumprobiert und bin jetzt bei folgendem:

Code: Alles auswählen

import msvcrt
from Tkinter import *
import tkMessageBox
def keylogger(x=0): 
   while x<>"5": 
      x=msvcrt.getch()
      root=Tk()
      tkMessageBox.showwarning("Keypress",x)
      root.destroy()
         
keylogger()
Das funktioniert einwandfrei, solang ich das script mit Konsole ausführe.
Aber ich wollte das Programm ja gerne im Hintergrund laufen lassen. Wenn ich jetzt das Script als .pyw speichere, dann gibt tkMessageBox permanent ein y mit Diärese aus.
Kann mir jemand sagen was ich falsch mache?
Danke schon mal,
Gruß
LordMyder

Edit (Leonidas): Code in Python-Tags gesetzt.
lordmyder

Mittwoch 3. Januar 2007, 18:50

Mir ist gerade aufgefallen, dass das mit der Konsole auch nur funktioniert, wenn die Konsole im Focus ist. Ich vermute, dass das der Grund dafür ist, das es ohne Konsole nicht geht.
Aber auch hier die Frage:
Wer kann mir sagen wie ich das Problem löse?
Danke
LordMyder
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 3. Januar 2007, 19:05

lordmyder hat geschrieben:Ich möchte ein Programm schreiben, dass im Hintergrund läuft, und dennoch auf bestimmte Tastenkombinationen reagiert.
Hi LordMyder!

Mit wxPython funktioniert das z.B. so:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
#
# Drückt man die Tastenkombination <WIN>+<q>, dann wird das Programm beendet.
# Drückt man die Tastenkombination <WIN>+<o>, dann wird eine MessageBox angezeigt.

import wx

wx.SetDefaultPyEncoding("iso-8859-1")


class MyFrame(wx.Frame):
    def __init__(self, parent = None, id = -1, title = "Globale Hotkeys"):
        wx.Frame.__init__(
            self, parent, id, title, style = wx.DEFAULT_FRAME_STYLE | wx.WANTS_CHARS
        )
        
        # Registriert einen systemweiten Hotkey (<WIN> + <q>)
        # Mögliche Modifikatoren: wx.MOD_SHIFT, wx.MOD_CONTROL, wx.MOD_ALT, wx.MOD_WIN
        hotkey_id = wx.NewId()
        print "Register Hotkey:", self.RegisterHotKey(hotkey_id, wx.MOD_WIN, 81)
        self.Bind(wx.EVT_HOTKEY, self.close_me, id = hotkey_id)
        
        # Registriert einen systemweiten Hotkey (<WIN> + <o>)
        hotkey_id = wx.NewId()
        print "Register Hotkey:", self.RegisterHotKey(hotkey_id, wx.MOD_WIN, 79)
        self.Bind(wx.EVT_HOTKEY, self.show_messagebox, id = hotkey_id)
        
        # Wurde nur gebraucht, um den KeyCode herauszufinden:
        #self.Bind(wx.EVT_KEY_UP, self.on_frame_key_up)
    
    def close_me(self, event):
        print "Programm beenden"
        self.Close()

    def show_messagebox(self, event = None):
        print "Nachricht anzeigen"
        wx.MessageBox("Hallo Welt")
    
    #def on_frame_key_up(self, event):
    #    print "KeyCode:", event.GetKeyCode()


def main():
    app = wx.PySimpleApp()
    f = MyFrame(None)
    #f.Show() # Frame nicht anzeigen :-)
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)

PS: Diese Lösung funktioniert nur unter Windows. Unter Linux kann man auf die XLib (z.B. per ctypes --> http://code.google.com/p/pyxlib-ctypes/) ausweichen.
Zuletzt geändert von gerold am Samstag 16. Januar 2010, 23:09, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Mittwoch 3. Januar 2007, 19:56

ich kann zur problemloesung leider auch nicht helfen, will nur sagen dass ich auch brennend sowas suche (vieleicht weis nhemand wies mit c oder so geht und will uns eien art api, schreivben, mit der man einfach uener stdin und stdout komuniziert)
cp != mv
Antworten