我正在制作一个供个人使用的截图实用程序,我想添加边界框截图。我希望能够在该区域的两个角上按插入,然后抓住屏幕截图。
问题在于我无法让键盘和鼠标事件相互协作。我似乎无法获得鼠标位置。
这是我到目前为止所做的:
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。如果这没有意义,我会永远对不起。
答案 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()