>>> import pyHook, pythoncom
>>> def kbproc( evt ): print evt.Ascii
...
>>> hm = pyHook.HookManager()
>>> hm.KeyDown = kbproc
>>> hm.HookKeyboard()
>>> pythoncom.PumpMessages()
Egy olyasmit akarok ami kategoriazalja a logot a forras app-tol fuggoen. Szoval kulon logolja azt amit a bongeszobe irok, kulon azt amit az editor, es mondjuk nem logolja azt amit az irckliensbe.
Mivel az eventbol kiolvashato az ablak handleje ami eppen aktiv volt a billentyuzet leutes pillanataban ez eleg egyszeruen megoldhato. A handle alapjan az hozza tartozo app pid-jet kell meghatarozni, az alapjan pedig le lehet kerdezni a program nevet. (GetModuleFileName)
Ime a prototipus:
def getProcNameByPID( pid ):
h = None
try:
h = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, False, pid)
return os.path.basename( win32process.GetModuleFileNameEx( h, 0 ) )
finally:
if h: h.Close()
Ja, es a pidet az ablak handle-bol pedig igy kaptam meg:
win32process.GetWindowThreadProcessId( evt.Window )[1]
A keyboard proc pedig a kovetkezo:
def keyBoardProc( evt ):
if evt.Key == 'F12':
hm.KeyDown = None
hm.UnhookKeyboard()
return
if evt.Ascii:
fname = '%s.log' % ( getProcNameByPID( win32process.GetWindowThreadProcessId( evt.Window )[1] ) )
open( fname, 'a' ).write( "%c" % (evt.Ascii) )
Lathato hogy F12-re probaltam meg unhookolni viszont, ilyenkor a lib egy AV-vel elszall, ugyhogy ez a feature nemigazan mukodik. Ha valaki tudja miert plz irja meg.
Mindenesetre a szelektalas jol mukodik, konnyen beallithato kulonbozo filter, hogy pl ircklienst vagy jatekot ne logolja mert az egyik ugyis logol maganak, a masiknal meg tok felesleges.
Majd ha lesz vmi vegleges verzio, esetleg kozzeteszem :)

0 comments:
Post a Comment