1

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

问题是我无法让键盘和鼠标事件相互配合。我似乎无法获得鼠标位置。

这是我到目前为止所拥有的:

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 也不会从“无”改变。

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

ps如果这没有意义,我永远很抱歉。

4

1 回答 1

1

您的问题是 mospos 在您的代码中没有用作全局变量。

OnMouseEvent中,当您将 mospos 设置为 时event.position,您只需设置一个局部变量,顺便命名为 mospos。不是同一个变量!

您必须使用关键字显式声明,将OnMouseEventmospos 视为全局变量global

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 来获取光标位置可能有点过头了。

另一种解决方案是在键盘挂钩中使用 call GetCursorInfo()from 。win32gui

flags, hcursor, mospos = win32gui.GetCursorInfo()
于 2014-11-14T10:07:57.567 回答