Pyhook:一起使用键盘事件和鼠标事件

时间:2014-10-06 07:01:24

标签: python python-imaging-library pyhook

我正在制作一个供个人使用的截图实用程序,我想添加边界框截图。我希望能够在该区域的两个角上按插入,然后抓住屏幕截图。

问题在于我无法让键盘和鼠标事件相互协作。我似乎无法获得鼠标位置。

这是我到目前为止所做的:

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
即使我导致鼠标事件,也不会改变'无'。

如何从键盘事件处理程序中获取鼠标位置?

P.S。如果这没有意义,我会永远对不起。

1 个答案:

答案 0 :(得分: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来获取光标位置可能会有点过分。

另一个解决方案是在键盘挂钩中使用来自GetCursorInfo()的来电win32gui

flags, hcursor, mospos = win32gui.GetCursorInfo()