Seite 1 von 1

Wieder mal: Keyloggen

Verfasst: Mittwoch 3. Januar 2007, 17:24
von lordmyder
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

Verfasst: Mittwoch 3. Januar 2007, 17:52
von Python 47
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

Verfasst: Mittwoch 3. Januar 2007, 18:46
von lordmyder
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.

Verfasst: Mittwoch 3. Januar 2007, 18:50
von lordmyder
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

Re: Wieder mal: Keyloggen

Verfasst: Mittwoch 3. Januar 2007, 19:05
von gerold
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.

Verfasst: Mittwoch 3. Januar 2007, 19:56
von Costi
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)