【问题标题】:disable or lock mouse and keyboard in Python?在 Python 中禁用或锁定鼠标和键盘?
【发布时间】:2011-11-23 16:56:02
【问题描述】:

有没有办法使用 python 禁用或锁定鼠标和键盘?我想冻结鼠标并禁用键盘。

【问题讨论】:

    标签: python


    【解决方案1】:

    我还没有测试过(实际上我已经测试过鼠标部分,而且它很烦人)但是像这样使用pyhook 会做你想做的事:

    import pythoncom, pyHook 
    
    def uMad(event):
        return False
    
    hm = pyHook.HookManager()
    hm.MouseAll = uMad
    hm.KeyAll = uMad
    hm.HookMouse()
    hm.HookKeyboard()
    pythoncom.PumpMessages()
    

    【讨论】:

    • 它工作得很好..(烦人)大声笑......我现在的问题是如何启用它。我只是将布尔值更改为 True 吗?
    • 您必须使用另一个始终返回 True 的函数重新定义 MouseAllKeyAll。然后键盘和鼠标将再次启用。
    【解决方案2】:

    我已将 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.")
    

    你可以看看主例程的用法。

    【讨论】:

    • 为什么投反对票?该代码在我的许多自动化脚本中运行良好。如果有任何问题,请发表评论或发送消息,以便我改进。
    【解决方案3】:

    对我来说,只需两行编程就解决了这个问题:

    from ctypes import *
    
    ok = windll.user32.BlockInput(True) #enable block
    
    #or 
    
    ok = windll.user32.BlockInput(False) #disable block 
    

    【讨论】:

    • 如果你在 Windows 上,这绝对是最简单的事情
    • windll到底是什么?
    • @Filip 它需要以管理员身份运行
    • 顺便说一句,这个命令不会阻止按下Ctrl + Alt + Del组合。
    • 你能告诉我如何操作它,试过但似乎不起作用
    【解决方案4】:

    完全不同的做法,因为上面提到的所有解决方案都使用了一个安静的过时库(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")
    

    【讨论】:

    • 这不会阻止鼠标输入左键单击/右键单击。它只是将指针推到 (0, 0) 但你有完​​全阻止鼠标输入的解决方案吗?
    【解决方案5】:

    我只是稍微修改了@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()
    

    希望这段代码对你有帮助

    【讨论】:

      【解决方案6】:

      您可以使用 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)
      

      好吧,它并不完美,但它会阻止你用鼠标做任何事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多