之前用python3做游戏自动化脚本,用过很多东西,然后最终有一套完整的方案。在这里随便阐述一下核心思路:

游戏辅助的窗体设计方面:

不需要pyqt这种大型软件,写小工具用自带的tkinter就行了。当然,并不是自己纯手敲代码,是通过拖拽来实现的。怎么,你还不知道tkinter可以界面拖拽生成代码就行VB一样?

呵呵,PAGE了解一下。

游戏辅助的应用发布方面:

自然是用pyinstaller打包成32位版的exe发布了,带上程序图标,版本信息,都不是事儿

 游戏核心模拟方面:

当然不是通过手敲代码实现了,而是通过调用目前市场上强大的dll插件了。比如com组件如大漠插件、乐玩插件。或者说,把易语言的一些模块编译成windll来调用也行哦

辅助窗体热键注册方面:

这些需要用到底层的东西了,用win32的东西实现的,可以实现注册全局热键。原理是单独一个线程用于检测热键按下,然后热键按下后单独开辟线程执行需要的功能。鉴于原生的太难写,我自己封装了并且写了一个demo。注册全局组合键和单独的热键都是没问题的。

前面三个方面仁者见仁了。后面这个我就贴个核心源码吧,免得以后找不到了。

下面贴一段新的代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# File  : 简单热键.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date  : 2020/3/4import win32con
import ctypes
import ctypes.wintypes
from threading import Thread,activeCount, enumerate
from time import sleep,timeclass Hotkey(Thread):user32 = ctypes.windll.user32hkey_list = {}hkey_flags = {} #按下hkey_running = {} #启停_reg_list = {} #待注册热键信息def regiskey(self, hwnd=None, flagid=0, fnkey=win32con.MOD_ALT, vkey=win32con.VK_F9):  # 注册热键,默认一个alt+F9return self.user32.RegisterHotKey(hwnd, flagid, fnkey, vkey)def get_reginfo(self):return self._reg_listdef get_id(self,func):self_id = Nonefor id in self.get_reginfo():if self.get_reginfo()[id]["func"] == func:self_id = idbreakif self_id:self.hkey_running[self_id] = Truereturn self_iddef get_running_state(self,self_id):if self.hkey_running.get(self_id):return self.hkey_running[self_id]else:return Falsedef 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 iddef fast_reg(self,id,key = (0,win32con.VK_HOME),func = lambda:print('热键注册开始')):if not self.regiskey(None, id, key[0], key[1]):print("热键注册失败")return Noneself.hkey_list[id] = funcself.hkey_flags[id] = Falsereturn iddef callback(self):def inner(self = self):for flag in self.hkey_flags:self.hkey_flags[flag] = Falsewhile 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] = Falsereturn innerdef 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] = Trueself.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(f"{self_id : } 你正在1秒1次的跳动")sleep(1)def stop_jump(start_id,hotkey):hotkey.hkey_running[start_id] = Falseprint(f"{start_id} 即将停止")sleep(1)print(f'当前线程列表:{activeCount()}', enumerate())def main():hotkey = Hotkey()start_id = hotkey.reg(key = (win32con.MOD_ALT,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(f"当前总线程数量:{activeCount()}")print('当前线程列表:', enumerate())print('热键注册初始化完毕,尝试按组合键alt+Home 或者单键END看效果')if __name__ == '__main__':main()

以下是旧的代码,用起来比较麻烦。

#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# File  : demo.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date  : 2019/6/28import win32con
import ctypes
import ctypes.wintypes
from threading import Thread, Timer, activeCount, enumerate
from time import sleep
h_ids = [i for i in range(2)]  # 创建两个热键序列
h_keys = {i: False for i in h_ids}  # 初始化所有热键序列的标志符为False
h_dict = {}  # 初始化一个空的字典,记录id与funcclass Hotkey(Thread):  # 创建一个Thread的扩展类user32 = ctypes.windll.user32  # 加载user32.dll# global h_ids, h_keys,h_dictdef regiskey(self, hwnd=None, flagid=0, fnkey=win32con.MOD_ALT, vkey=win32con.VK_F9):  # 注册热键,默认一个alt+F9return self.user32.RegisterHotKey(hwnd, flagid, fnkey, vkey)def callback(self, id, func):h_dict[id] = func  # 这个id对应这个func,没有就是新增,有就是修改def inner():for key, value in h_dict.items():print(f'总的热键池:{h_ids},当前热键序号:{key}, 当前热键功能:{value},当前热键状态:{h_keys[h_ids[key]]}')while True:for key, value in h_dict.items():if h_keys[h_ids[key]]:thread_it(value)  # 另外开线程执行valueh_keys[h_ids[key]] = Falsereturn innerdef run(self):# print(self.user32)if not self.regiskey(None,h_ids[0],win32con.MOD_ALT,win32con.VK_F9):   # 注册快捷键alt+F9并判断是否成功,该热键用于执行一次需要执行的内容。print(f"热键注册失败! id{h_ids[0]}")  # 返回一个错误信息if not self.regiskey(None,h_ids[1],0,win32con.VK_F10):   # 注册快捷键F10并判断是否成功,该热键用于结束程序,且最好这么结束,否则影响下一次注册热键。print(f"热键注册失败! id{h_ids[1]}")# 以下为检测热键是否被按下,并在最后释放快捷键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 h_ids:h_keys[msg.wParam] = Trueself.user32.TranslateMessage(ctypes.byref(msg))self.user32.DispatchMessageA(ctypes.byref(msg))finally:for i in h_ids:self.user32.UnregisterHotKey(None, i)# 必须得释放热键,否则下次就会注册失败,所以当程序异常退出,没有释放热键,# 那么下次很可能就没办法注册成功了,这时可以换一个热键测试def thread_it(func, *args):t = Thread(target=func, args=args)t.setDaemon(True)t.start()def settimeout(func, sec):def inner():func()Timer(sec, inner).start()thread_it(inner)def setinterval(func, sec, tmrname, flag=True):global timer_dicttimer_dict[tmrname] = flagprint("已设置tqtimer启用状态为:{}".format(flag))def inner():global timer_dictif timer_dict[tmrname]:func()Timer(sec, inner).start()thread_it(inner)def clearinterval(timername):global timer_dicttimer_dict[timername] = Falseflag = timer_dict[timername]print("已设置tqtimer启用状态为:{}".format(flag))def test_start():print("按下了开始键...the programe is running")def test_stop():print("按下了停止键...the programe is stopped")def run_ok():hotkey = Hotkey()hotkey.start()fn = hotkey.callback(0, test_start)fn = hotkey.callback(1, test_stop)thread_it(fn)sleep(0.5)count = activeCount()print(f"当前总线程数量:{count}")print('当前线程列表:', enumerate())print('热键注册初始化完毕,尝试按组合键alt+F9 或者单键F10看效果')while True:passif __name__ == '__main__':run_ok()

这里是没弄界面的源码,所以我就把主线程死循环阻塞了。运行后按alt+F9会打印按下了开始键,按F10会打印按下了停止键。

如果你在tkinter里面跑,直接把run_ok函数后面的while True:pass删掉,然后在init函数里面加入run_ok()就行了。这里指的用PAGE设计的tkinter程序哈!

那么窗体创建完毕就会自动阻塞主线程,其他监控热键的线程随主线程结束。启动期间独立运行互不干扰。

python3注册全局热键相关推荐

  1. python3 全局热键_python3注册全局热键的实现

    之前用python3做游戏自动化脚本,用过很多东西,然后最终有一套完整的方案.在这里随便阐述一下核心思路: 游戏辅助的窗体设计方面: 不需要pyqt这种大型软件,写小工具用自带的tkinter就行了. ...

  2. 拍牌神器是怎样炼成的(三)---注册全局热键

    要想在上海拍牌的超低中标率中把握机会.占得先机,您不仅需要事先准备好最优的竞拍策略,还要制定若干套应急预案,应对不时之需.既定策略交给计算机自动执行,没有问题.可是谁来召唤应急预案呢?使用全局热键应该 ...

  3. 对VB注册全局热键的思考——是不是RegisterHotKey的1个ID可以注册多组热键?

    最近在网络上看到用VB注册热键的代码,试了下,觉得很好用.经过一番分析,我又简化了一下源代码,把没有必要的代码删去,还是能成功.由此引发了一些思考,是不是RegisterHotKeyr的1个ID可以注 ...

  4. 全局热键给截图自动加水印并win10系统通知

    大家好,我是小小明. 常写博客或公众号的号主们都非常清楚,一旦出名自己的文章就容易被一些培训机构胡乱搬运,这些无良培训机构实在太多,靠举报根本举报不过来,不如直接利用他们给自己做一波宣传.基本的思路就 ...

  5. linux下qt响应全局热键,Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)...

    Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是W ...

  6. Delphi全局热键的注册

    1.在窗启动时创建ATOM;(aatom:ATOM;定义在private中) 1 if FindAtom('ZWXhotKey')=0 then 2 begin 3 aatom:=GlobalAddA ...

  7. Delphi 全局热键注册+使用

    RAD Studio 10.2.3 测试√ 全局变量: varmHotKey01, mHotKey02: Integer; 1.在程序创建的时候或者窗体显示的时候注册热键 begin// 原子[mHo ...

  8. Qt全局热键(windows篇)

    Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是W ...

  9. VB 全局热键HOOK (不占系统资源版本)

    VB 全局热键HOOK (不占系统资源版本) 看过网上很多的全局热键的写法,几乎都用 do loop 写,很占资源. 这个是占很少资源的 全局热键. Option Explicit Private D ...

最新文章

  1. 素数c语言程序解题思路,C语言上机实验题目解题思路.doc
  2. php建立数据库操作类,PHP数据库操作类的定义及使用
  3. 爸,这下你还敢抽烟么?
  4. 33个PPT下载丨2018年PostgreSQL中国技术大会PPT
  5. java 蓝桥杯 石子游戏(题解)
  6. Python绘制直方图案例一则
  7. 软件人员kpi制定模板_软件科技公司绩效考核办法模板
  8. oracle em登陆失败,oracle的em登陆失败解决办法
  9. linux系统中命令执行的优先级以及命令格式
  10. Javascript学习之创建对象
  11. php 编译安装参数详解
  12. iOS开发调用苹果自带的地图应用
  13. unity material以及各种贴图介绍
  14. 使用xcelsius创建令人惊叹的幻灯片 --xcelsius入门
  15. SpringBoot微服务技术中进程间通信原理
  16. 基金定投--1.基金的基础知识
  17. http://wenku.baidu.com/view/d6433106a6c30c2259019e63.html
  18. 上手Fragment
  19. nagiso中nsca的配置
  20. 遍历HashMap的几种常用方法

热门文章

  1. C++ 数学与算法系列之高斯消元法求解线性方程组
  2. sync.Pool 使用
  3. redis-----07-----redigo基本命令操作(主要讲如何让go的struct、map展开成redis的参数,以及使用struct获取redis返回的key-value批量数组)
  4. 3d在线展示_手表三维商品展示解决方案
  5. Macbook Pro 启动Win7的过程中黑屏(black screen)
  6. HarmonyOS 系统架构
  7. 【Matlab】使用反步法设计控制器
  8. 目标主机showmount -e信息泄露(CVE-1999-0554),如何禁止只允许特定主机使用showmount -e查看挂载列表
  9. 世界杯已开赛,哪些看球设备让你觉得身临其境?
  10. wps怎么把xlsx转成html,怎样把wps转换成excel