python热键+鼠标键盘控制

应用:ctrl+home自动输入文本;home停止

代码:hotkey

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import win32con
import ctypes
import ctypes.wintypes
from threading import Thread,activeCount, enumerate
from time import sleep,time

###############################################################
import win32api
VK_CODE = {
    'backspace':0x08,
    'tab':0x09,
    'clear':0x0C,
    'enter':0x0D,
    'shift':0x10,
    'ctrl':0x11,
    'alt':0x12,
    'pause':0x13,
    'caps_lock':0x14,
    'esc':0x1B,
    'spacebar':0x20,
    'page_up':0x21,
    'page_down':0x22,
    'end':0x23,
    'home':0x24,
    'left_arrow':0x25,
    'up_arrow':0x26,
    'right_arrow':0x27,
    'down_arrow':0x28,
    'select':0x29,
    'print':0x2A,
    'execute':0x2B,
    'print_screen':0x2C,
    'ins':0x2D,
    'del':0x2E,
    'help':0x2F,
    '0':0x30,
    '1':0x31,
    '2':0x32,
    '3':0x33,
    '4':0x34,
    '5':0x35,
    '6':0x36,
    '7':0x37,
    '8':0x38,
    '9':0x39,
    'a':0x41,
    'b':0x42,
    'c':0x43,
    'd':0x44,
    'e':0x45,
    'f':0x46,
    'g':0x47,
    'h':0x48,
    'i':0x49,
    'j':0x4A,
    'k':0x4B,
    'l':0x4C,
    'm':0x4D,
    'n':0x4E,
    'o':0x4F,
    'p':0x50,
    'q':0x51,
    'r':0x52,
    's':0x53,
    't':0x54,
    'u':0x55,
    'v':0x56,
    'w':0x57,
    'x':0x58,
    'y':0x59,
    'z':0x5A,
    'numpad_0':0x60,
    'numpad_1':0x61,
    'numpad_2':0x62,
    'numpad_3':0x63,
    'numpad_4':0x64,
    'numpad_5':0x65,
    'numpad_6':0x66,
    'numpad_7':0x67,
    'numpad_8':0x68,
    'numpad_9':0x69,
    'multiply_key':0x6A,
    'add_key':0x6B,
    'separator_key':0x6C,
    'subtract_key':0x6D,
    'decimal_key':0x6E,
    'divide_key':0x6F,
    'F1':0x70,
    'F2':0x71,
    'F3':0x72,
    'F4':0x73,
    'F5':0x74,
    'F6':0x75,
    'F7':0x76,
    'F8':0x77,
    'F9':0x78,
    'F10':0x79,
    'F11':0x7A,
    'F12':0x7B,
    'F13':0x7C,
    'F14':0x7D,
    'F15':0x7E,
    'F16':0x7F,
    'F17':0x80,
    'F18':0x81,
    'F19':0x82,
    'F20':0x83,
    'F21':0x84,
    'F22':0x85,
    'F23':0x86,
    'F24':0x87,
    'num_lock':0x90,
    'scroll_lock':0x91,
    'left_shift':0xA0,
    'right_shift ':0xA1,
    'left_control':0xA2,
    'right_control':0xA3,
    'left_menu':0xA4,
    'right_menu':0xA5,
    'browser_back':0xA6,
    'browser_forward':0xA7,
    'browser_refresh':0xA8,
    'browser_stop':0xA9,
    'browser_search':0xAA,
    'browser_favorites':0xAB,
    'browser_start_and_home':0xAC,
    'volume_mute':0xAD,
    'volume_Down':0xAE,
    'volume_up':0xAF,
    'next_track':0xB0,
    'previous_track':0xB1,
    'stop_media':0xB2,
    'play/pause_media':0xB3,
    'start_mail':0xB4,
    'select_media':0xB5,
    'start_application_1':0xB6,
    'start_application_2':0xB7,
    'attn_key':0xF6,
    'crsel_key':0xF7,
    'exsel_key':0xF8,
    'play_key':0xFA,
    'zoom_key':0xFB,
    'clear_key':0xFE,
    '+':0xBB,
    ',':0xBC,
    '-':0xBD,
    '.':0xBE,
    '/':0xBF,
    '`':0xC0,
    ';':0xBA,
    '[':0xDB,
    '\\':0xDC,
    ']':0xDD,
    "'":0xDE}
VK_CODE1 = {
    'A':'a',
    'B':'b',
    'C':'c',
    'D':'d',
    'E':'e',
    'F':'f',
    'G':'g',
    'H':'h',
    'I':'i',
    'J':'j',
    'K':'k',
    'L':'l',
    'M':'m',
    'N':'n',
    'O':'o',
    'P':'p',
    'Q':'q',
    'R':'r',
    'S':'s',
    'T':'t',
    'U':'u',
    'V':'v',
    'W':'w',
    'X':'x',
    'Y':'y',
    'Z':'z',
    ')':'0',
    '!':'1',
    '@':'2',
    '#':'3',
    '$':'4',
    '%':'5',
    '^':'6',
    '&':'7',
    '*':'8',
    '(':'9',
    '=':'+',
    '<':',',
    '_':'-',
    '>':'.',
    '?':'/',
    '~':'`',
    ':':';',
    '{':'[',
    '|':'\\',
    '}':']',
    '"':"'"}
class Point(ctypes.Structure):
    _fields_=[("x",ctypes.c_long),("y",ctypes.c_long)]
def mouse_get_point():
    po=Point()
    ctypes.windll.user32.GetCursorPos(ctypes.byref(po))
    return int(po.x),int(po.y)
def mouse_down():
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
def mouse_up():
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
def mouse_click(x=None,y=None):#模拟鼠标单击
    if not x is None and not y is None:
        mouse_move(x,y)
        sleep(0.05)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
def mouse_rclick(x=None,y=None):#模拟鼠标单击
    if not x is None and not y is None:
        mouse_move(x,y)
        sleep(0.05)
    win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)
def mouse_dclick(x=None,y=None):#模拟鼠标双击
    if not x is None and not y is None:
        mouse_move(x,y)
        sleep(0.05)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)#按下鼠标左键
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)#松开鼠标左键
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
def mouse_move(x,y):
    ctypes.windll.user32.SetCursorPos(x, y)#将鼠标移动到对应位置但是不点击
def key_autinput(str_input=''):#自动识别上档键和下档建并输出
    for c in str_input:
        if c in VK_CODE1:
            win32api.keybd_event(VK_CODE['shift'],0,0,0)#按键
            win32api.keybd_event(VK_CODE[VK_CODE1[c]],0,0,0)#按键
            win32api.keybd_event(VK_CODE['shift'],0,win32con.KEYEVENTF_KEYUP,0)#释放按键
            win32api.keybd_event(VK_CODE[VK_CODE1[c]],0,win32con.KEYEVENTF_KEYUP,0)#释放按键
            sleep(0.05)#延时1else:
            win32api.keybd_event(VK_CODE[c],0,0,0)#按键
            win32api.keybd_event(VK_CODE[c],0,win32con.KEYEVENTF_KEYUP,0)#释放按键
            sleep(0.05)#延时1秒
            
def key_continput(str_input=''):#联系按下键再连续释放
    for c in str_input:
        if c in VK_CODE1:
            #win32api.keybd_event(VK_CODE['shift'],0,0,0)#按键
            win32api.keybd_event(VK_CODE[VK_CODE1[c]],0,0,0)#按键
            #win32api.keybd_event(VK_CODE['shift'],0,win32con.KEYEVENTF_KEYUP,0)#释放按键
            #win32api.keybd_event(VK_CODE[VK_CODE1[c]],0,win32con.KEYEVENTF_KEYUP,0)#释放按键
            sleep(0.05)#延时1else:
            win32api.keybd_event(VK_CODE[c],0,0,0)#按键
            #win32api.keybd_event(VK_CODE[c],0,win32con.KEYEVENTF_KEYUP,0)#释放按键
            sleep(0.05)#延时1for c in str_input:    
        if c in VK_CODE1:
            win32api.keybd_event(VK_CODE[VK_CODE1[c]],0,win32con.KEYEVENTF_KEYUP,0)#释放按键
            sleep(0.05)#延时1else:
            win32api.keybd_event(VK_CODE[c],0,win32con.KEYEVENTF_KEYUP,0)#释放按键
            sleep(0.05)#延时1秒
def key_shift_down():
    win32api.keybd_event(VK_CODE["shift"],0,0,0)#按下shift键
def key_shift_up():
    win32api.keybd_event(VK_CODE["shift"],0,win32con.KEYEVENTF_KEYUP,0)#按下shift键
    
#################################################################

 
class Hotkey(Thread):
  user32 = ctypes.windll.user32
  hkey_list = {}
  hkey_flags = {} #按下
  hkey_running = {} #启停
  _reg_list = {} #待注册热键信息
 
  def regiskey(self, hwnd=None, flagid=0, fnkey=win32con.MOD_ALT, vkey=win32con.VK_F9): # 注册热键,默认一个alt+F9
    return self.user32.RegisterHotKey(hwnd, flagid, fnkey, vkey)
 
  def get_reginfo(self):
    return self._reg_list
 
  def get_id(self,func):
    self_id = None
    for id in self.get_reginfo():
      if self.get_reginfo()[id]["func"] == func:
        self_id = id
        break
    if self_id:
      self.hkey_running[self_id] = True
    return self_id
 
  def get_running_state(self,self_id):
    if self.hkey_running.get(self_id):
      return self.hkey_running[self_id]
    else:
      return False
 
  def reg(self,key,func,args=None):
    id = int(str(round(time()*10))[-6:])
    fnkey = key[0]
    vkey = key[1]
    info = {
      "fnkey":fnkey,
      "vkey":vkey,
      "func":func,
      "args":args
    }
    self._reg_list[id] = info
    # print(info) #这里待注册的信息
    sleep(0.1)
    return id
 
  def fast_reg(self,id,key = (0,win32con.VK_HOME),func = lambda:print('热键注册开始')):
    if not self.regiskey(None, id, key[0], key[1]):
      print("热键注册失败")
      return None
    self.hkey_list[id] = func
    self.hkey_flags[id] = False
    return id
 
  def callback(self):
    def inner(self = self):
      for flag in self.hkey_flags:
        self.hkey_flags[flag] = False
 
      while True:
        for id, func in self.hkey_list.items():
          if self.hkey_flags[id]:
            args = self._reg_list[id]["args"]
            if args:
              # print(args)  #这里打印传入给注册函数的参数
              thread_it(func,*args)
            else:
              thread_it(func)
            self.hkey_flags[id] = False
    return inner
 
  def run(self):
    for id in self._reg_list:
      reg_info = self._reg_list[id]
      fnkey = reg_info["fnkey"]
      vkey = reg_info["vkey"]
      func = reg_info["func"]
      self.fast_reg(id,(fnkey, vkey), func)
 
    fn = self.callback()
    thread_it(fn) # 启动监听热键按下线程
 
    try:
      msg = ctypes.wintypes.MSG()
      while True:
        if self.user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:
          if msg.message == win32con.WM_HOTKEY:
            if msg.wParam in self.hkey_list:
              self.hkey_flags[msg.wParam] = True
          self.user32.TranslateMessage(ctypes.byref(msg))
          self.user32.DispatchMessageA(ctypes.byref(msg))
    finally:
      for id in self.hkey_list:
        self.user32.UnregisterHotKey(None, id)
 
def thread_it(func, *args):
  t = Thread(target=func, args=args)
  t.setDaemon(True)
  t.start()
 
def jump(func,hotkey):
  self_id = hotkey.get_id(func)
  while hotkey.get_running_state(self_id):
    #print(self_id ,": 你正在1秒1次的跳动")
    sleep(1)
    key_autinput("34IOp")
    #hotkey.hkey_running[self_id] = False
    
def stop_jump(start_id,hotkey):
  hotkey.hkey_running[start_id] = False
  print(start_id," 即将停止")
  sleep(1)
  print("当前线程列表:",activeCount(), enumerate())
 
def main():
  hotkey = Hotkey()
  start_id = hotkey.reg(key = (win32con.MOD_CONTROL,win32con.VK_HOME),func=jump,args=(jump,hotkey)) #alt home键 开始
  hotkey.reg(key = (0,win32con.VK_END),func=stop_jump,args=(start_id,hotkey)) #alt end键 结束
  hotkey.start() #启动热键主线程
 
  print("当前总线程数量:",activeCount())
  print('当前线程列表:', enumerate())
  print('热键注册初始化完毕,尝试按组合键alt+Home 或者单键END看效果')
 
if __name__ == '__main__':
  main()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值