【发布时间】:2011-11-23 16:56:02
【问题描述】:
有没有办法使用 python 禁用或锁定鼠标和键盘?我想冻结鼠标并禁用键盘。
【问题讨论】:
标签: python
有没有办法使用 python 禁用或锁定鼠标和键盘?我想冻结鼠标并禁用键盘。
【问题讨论】:
标签: python
我还没有测试过(实际上我已经测试过鼠标部分,而且它很烦人)但是像这样使用pyhook 会做你想做的事:
import pythoncom, pyHook
def uMad(event):
return False
hm = pyHook.HookManager()
hm.MouseAll = uMad
hm.KeyAll = uMad
hm.HookMouse()
hm.HookKeyboard()
pythoncom.PumpMessages()
【讨论】:
MouseAll 和 KeyAll。然后键盘和鼠标将再次启用。
我已将 Fábio Diniz 的答案扩展到提供 block() 和 unblock() 函数的类,该函数可以(选择性地)阻止鼠标/键盘输入。我还添加了一个超时功能,它(希望)解决了将自己锁定在外面的烦恼。
import pyHook
from threading import Timer
import win32gui
import logging
class blockInput():
def OnKeyboardEvent(self,event):
return False
def OnMouseEvent(self,event):
return False
def unblock(self):
logging.info(" -- Unblock!")
if self.t.is_alive():
self.t.cancel()
try: self.hm.UnhookKeyboard()
except: pass
try: self.hm.UnhookMouse()
except: pass
def block(self, timeout = 10, keyboard = True, mouse = True):
self.t = Timer(timeout, self.unblock)
self.t.start()
logging.info(" -- Block!")
if mouse:
self.hm.MouseAll = self.OnMouseEvent
self.hm.HookMouse()
if keyboard:
self.hm.KeyAll = self.OnKeyboardEvent
self.hm.HookKeyboard()
win32gui.PumpWaitingMessages()
def __init__(self):
self.hm = pyHook.HookManager()
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
block = blockInput()
block.block()
import time
t0 = time.time()
while time.time() - t0 < 10:
time.sleep(1)
print(time.time() - t0)
block.unblock()
logging.info("Done.")
你可以看看主例程的用法。
【讨论】:
对我来说,只需两行编程就解决了这个问题:
from ctypes import *
ok = windll.user32.BlockInput(True) #enable block
#or
ok = windll.user32.BlockInput(False) #disable block
【讨论】:
Ctrl + Alt + Del组合。
完全不同的做法,因为上面提到的所有解决方案都使用了一个安静的过时库(pyhook),而这个 pyhook 方法对我个人来说并不适用。
import keyboard
from pynput.mouse import Controller
from time import sleep
def blockinput():
global block_input_flag
block_input_flag = 1
t1 = threading.Thread(target=blockinput_start)
t1.start()
print("[SUCCESS] Input blocked!")
def unblockinput():
blockinput_stop()
print("[SUCCESS] Input unblocked!")
def blockinput_start():
mouse = Controller()
global block_input_flag
for i in range(150):
keyboard.block_key(i)
while block_input_flag == 1:
mouse.position = (0, 0)
def blockinput_stop():
global block_input_flag
for i in range(150):
keyboard.unblock_key(i)
block_input_flag = 0
blockinput()
print("now blocking")
sleep(5)
print("now unblocking")
【讨论】:
我只是稍微修改了@Robert 代码,而不是我使用外部中断来关闭程序的时间,即如果您连接任何外部驱动器,那么程序就会关闭并且您的鼠标和键盘将正常工作。
import pyHook
from threading import Timer
import win32gui
import logging
import win32file
def locate_usb():#this will check any external Drives
drive_list = []
drivebits = win32file.GetLogicalDrives()
# print(drivebits)
for d in range(1, 26):
mask = 1 << d
if drivebits & mask:
# here if the drive is at least there
drname = '%c:\\' % chr(ord('A') + d)
t = win32file.GetDriveType(drname)
if t == win32file.DRIVE_REMOVABLE:
drive_list.append(drname)
return drive_list
class blockInput():
def OnKeyboardEvent(self,event):
return False
def OnMouseEvent(self,event):
return False
def unblock(self):
try: self.hm.UnhookKeyboard()
except: pass
try: self.hm.UnhookMouse()
except: pass
def block(self ,keyboard = True, mouse = True):
while(1):
if mouse:
self.hm.MouseAll = self.OnMouseEvent
self.hm.HookMouse()
if keyboard:
self.hm.KeyAll = self.OnKeyboardEvent
self.hm.HookKeyboard()
win32gui.PumpWaitingMessages()
cg= locate_usb()
if cg:
break
def __init__(self):
self.hm = pyHook.HookManager()
if __name__ == '__main__':
block = blockInput()
block.block()
block.unblock()
希望这段代码对你有帮助
【讨论】:
您可以使用 pyautogui 来执行此操作。虽然我建议添加键盘来制作停止键。首先,您要安装 pyautogui 和键盘。 请注意:这只会禁用鼠标而不是键盘,这是一个非常糟糕的主意。
pip install pyautogui
pip install keyboard
好的,排序后,我们必须实际制作禁用器。
import pyautogui
import keyboard
stopKey = "s" #The stopKey is the button to press to stop. you can also do a shortcut like ctrl+s
maxX, maxY = pyautogui.size() #get max size of screen
While True:
if keyboard.is_pressed(stopKey):
break
else:
pyautogui.moveTo(maxX/2, maxY/2) #move the mouse to the center of the screen
好的,但是有两种方法可以摆脱这种情况。按下 S,同时将鼠标快速移动到屏幕的一个角落(这是一个 pyautogui 故障保护,但我们可以禁用它)。如果要禁用故障保护,请在导入后添加:
pyautogui.FAILSAFE = False
请注意,不建议禁用故障保护! 好的,所以现在退出的唯一方法是 S 键。如果您想在程序的其他地方停止此操作,请执行以下操作:
pyautogui.press(stopKey)
好吧,它并不完美,但它会阻止你用鼠标做任何事情。
【讨论】: