Hello all,
I just joined this list. I am pretty new to Python, but I really like and hope to get more into it; right now, it is my second-favorite, second only to java. I am a computer science major in my third year and currently only program as a hobby/for something to do. Also, I am blind so I use JAWS for Windows (from http://www.freedomscientific.com) to do all my computer work; basically, this program reads me the screen. I only mention this so the projects I am doing make sense and so you understand why suggesting things like looking at a diagram or an animation will not work.

Anyway, onto the problem. I am working on a simple resource monitor (I have never found one that works well with screen readers, so I am writing one). I am using python2.6 with all the win32 libs installed. My monitor will use wmi to get all of its information, and it was going pretty well until a few hours ago, when I started receiving seemingly random errors. I can call my functions, such as getFreeRam or getLoad, with no problem as long as the call is hard-coded into the script. However, when I try to call said functions from a function monitoring keyboard input (using pyHooks), I get an error and the program crashes (at least it did until I put a try/except in there, but hitting the hotkey over and over always gives me an error). I will paste the entire file below. It is not very commented yet, so if something does not make sense, please let me know. My questions are:

1. Why am I getting these errors?

2. The getLoad function only returns one number (the counter is there to double check that the loop really only runs once). I have a dual core AMD, so I expected two numbers, a LoadPercentage for each core, not just one number. How do I get the load per core, not per physical processor?

3. Regarding pyHook: I press my win-` hotkey on the desktop and get something to happen in my script, which is good. However, I also get a Windows error sound. Is there a way to grab that keystroke before Windows can get it to avoid what seems to be passing the keystroke to the active app before my script can get it? I tried returning False in my keyUp function but that made no difference.

I am running Windows 7 Home Premium, 64 bit, on an AMD processor whose exact model escapes me. It is clocked at around 2.4ghz and I have 4gb of 800mhz ddr2 ram. The pc was built by my friend and I from Newegg parts, but has worked well for the last 18 months (seeing three different operating systems). Win7 was installed a few days ago, so I am pretty sure there is no problem with my installation as far as wmi goes. I tried to run the wmi diagnostic utility, but I got an error; I figure the utility cannot run in 64 bit, but I am not sure. Anyway, any help here would be greatly appreciated. This is my first "real" project in python, so go easy on my stupid mistakes. :) Thanks!


CODE

import os, sys, wmi, win32com.client, pyHook, pythoncom

pythoncom.CoInitialize() #a forum post said I should put this...

win=0 #is either Windows key pressed?
ctrl=0 #either control key pressed?
alt=0 #what about either alt key?
#for speaking text with the user's active screenreader, or sapi if no reader
#http://www.empowermentzone.com/saysetup.exe
speaker=win32com.client.Dispatch("Say.Tools")
c=wmi.WMI("localhost") #for WMI access

def getLoad():
i=0
#get proc load, currently only first core for some reason
for p in c.Win32_Processor():
 load=p.LoadPercentage
 i=i+1
# end for
speaker.say(str(load)+", looped "+str(i)+" times.")
return(load)
#end def
#following works just fine here, but not when called later in keyUp method
getLoad()

def getFreeRam():
#get total ram and ram available
for info in c.Win32_OperatingSystem():
 ram=info.TotalVisibleMemorySize
 freeRam=info.FreePhysicalMemory
#end for
return(float(freeRam)/float(ram)*100) #return free ram as %
#end def

def toBiggestBytes(n):
#returns a string where n is in the largest logical measure possible
i=0 #counter
units=[" bytes","kb","mb","gb","tb"]
while(n>=1024):
 n=n/1024
 i=i+1
return(str(n)+units[i])
#end def

#following does not work: why?
"""
for t in c.MSAcpi_ThermalZoneTemperature():
temp=t.CurrentTemperature
# end for
"""

"""
#old interface used for early testing
end=0
while(end==0):
lr=raw_input("\nr for ram, l for CPU load, e to exit.\n")
if(lr=='r'):
 pRam=int(ram)/1024/1024
 speaker.say(str(pRam)+"mb total RAM")
if(lr=='l'):
 speaker.say(str(load)+"% for core 1")
if(lr=='e'):
 end=1 #exit loop
#endif
#end while
"""


#Copied directly from example.py in the pyHook folder, then modified
def OnKeyDownEvent(event):
global win
global ctrl
global alt
if(event.KeyID==91 or event.KeyID==92):
 #user is pressing a Windows key, so set flag
 win=1
#endif
# return True to pass the event to other handlers
# return False to stop the event from propagating
return True
#end def

def OnKeyUpEvent(event):
global win
global ctrl
global alt
if(event.KeyID==91 or event.KeyID==92):
 #user released the Windows key, so unset flag
 win=0
#endif
if(win==1 and chr(event.Ascii)=='`'):
 try:
  speaker.say(str(getLoad()))
 except:
  speaker.say("Stupid errors!")
 #end except
#endif
return True
#end def

# create the hook mananger
hm = pyHook.HookManager()
# register two callbacks
hm.KeyDown = OnKeyDownEvent
hm.KeyUp = OnKeyUpEvent

# hook into the keyboard event
hm.HookKeyboard()

if __name__ == '__main__':
 import pythoncom
 pythoncom.PumpMessages()

#end copying/modifying

speaker=None; #release speaker object


#reference so I know what properties I can get
"""
 print 'MessageName:',event.MessageName
 print 'Message:',event.Message
 print 'Time:',event.Time
 print 'Window:',event.Window
 print 'WindowName:',event.WindowName
 print 'Ascii:', event.Ascii, chr(event.Ascii)
 print 'Key:', event.Key
 print 'KeyID:', event.KeyID
 print 'ScanCode:', event.ScanCode
 print 'Extended:', event.Extended
 print 'Injected:', event.Injected
 print 'Alt', event.Alt
 print 'Transition', event.Transition
 print '---'
"""

Have a great day,
Alex
Email: mehg...@gmail.com
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to