2014-10-06 69 views
1

我正在製作一個供個人使用的截圖工具,我想添加邊界框截圖。我希望能夠在該區域的兩個角上按插入,然後抓取屏幕截圖。Pyhook:一起使用KeyboardEvents和MouseEvents

問題是我無法使鍵盤和鼠標事件相互協作。我似乎無法獲得鼠標位置。

這是我到目前爲止有:

from PIL import ImageGrab 
import time 
import pythoncom, pyHook 

mospos = None 

def OnMouseEvent(event): 
    print 'MessageName:',event.MessageName 
    print 'Message:',event.Message 
    print 'Position:',event.Position 
    print '---' 
    mospos = event.Position 
    return True 

def OnKeyboardEvent(event): 
    print 'KeyID:', event.KeyID#Show KeyID of keypress 
    if(event.KeyID == 44):#Prntscr 
     print 'Print Screen' 
     im = ImageGrab.grabclipboard() 
     im.save('img'+time.strftime("%d-%m-%y_%H-%M-%S")+'.png','PNG')#save with Day-Month-Year_Hour-Minute_Second format 
    if(event.KeyID == 45):#insert 
     print mospos 

    return True# return True to pass the event to other handlers 


hm = pyHook.HookManager()# create a hook manager 
hm.KeyDown = OnKeyboardEvent# watch for all key events 
hm.MouseAll = OnMouseEvent 
hm.HookKeyboard()# set the hook 
hm.HookMouse() 
pythoncom.PumpMessages()# wait forever 

mospos從來沒有從「無」更改即使我造成鼠標事件。

如何從鍵盤事件處理程序獲取鼠標位置?

p.s.如果這沒有意義,我永遠抱歉。

回答

1

你的問題是,你的代碼中沒有使用mospos作爲全局變量。

OnMouseEvent中,當您將mospos設置爲event.position時,您只需設置一個局部變量,順便命名爲mospos。 它不是同一個變量!

您必須明確聲明,在OnMouseEvent中,使用global關鍵字將mospos視爲全局變量。

def OnMouseEvent(event): 
    global mospos 
    mospos = event.Position 
    return True 

這樣,您將能夠讀取OnKeyboardEvent中的當前鼠標位置。

這是你的OnKeyboardEvent回調可能是什麼樣子,與用於存儲區的一個角落(在第二個插入按抓取屏幕)又一個全局變量:

def OnKeyboardEvent(event): 
    global origin 
    if(event.KeyID == 45): # insert 
     if origin is None: 
      origin = mospos 
     else: 
      bbox = (min(origin[0], mospos[0]), 
        min(origin[1], mospos[1]), 
        max(origin[0], mospos[0]), 
        max(origin[1], mospos[1])) 
      im = ImageGrab.grab(bbox) 
      im.save('img'+time.strftime("%d-%m-%y_%H-%M-%S")+'.png','PNG') # save with Day-Month-Year_Hour-Minute_Second format 
      origin = None 
    return True 

不過請注意,這可能是矯枉過正當你按下一個給定的鍵時,使用mouseHook來獲取光標位置。

另一種解決方案是在您的鍵盤鉤子中使用來自win32gui的呼叫GetCursorInfo()

flags, hcursor, mospos = win32gui.GetCursorInfo()