(未成功)用 Python 在LOL中 实现 可开关的按键连点
(未成功)用 Python 在LOL中 实现 可开关的按键连点
前言:
之所以想搞个这功能,主要是想玩一个无限插眼的BUG
1 采用 pywin32 库实现按键点击操作,pynput 库实现监听按键开关操作
一共 import 了 6 个库
-
win32api :实现点击操作
-
win32con : 跟上面那个一起的
-
ctypes : 获取按键虚拟码和扫描码,为了能在游戏中实现按键功能
-
threading : 多线程
-
time : 设置按键延时
-
pynput : 监听按键,实现可开关功能
-
os : 暂停运行
具体代码如下:
代码按着这个改的:利用python实现键盘连点器
``
from pynput.keyboard import Key, Listener
import os
import win32api
import win32con
import ctypes
import threading
import time
listening = 0 # 用来判断是否开始连按
# press这两个函数是与 listener 结合使用,传递按键名的
def on_presskey (key): # 监听按下
global listening
if str(key)=="'"+'q'+"'" and listening == 0: # 判断是否为对应按键
listening = 1
print('监听到按下1')
def on_releasekey(key): # 监听弹起
global listening
if str(key)=="'"+'q'+"'":
listening = 0
print('监听到释放1')
def press_key(): # 实现按键操作
global listening
while True:
if listening == 1: # 当判断条件成立时,开始连按
MapVirtualKey = ctypes.windll.user32.MapVirtualKeyA # 定义个变量替代后面那个,免得太长
win32api.keybd_event(0x51, MapVirtualKey(0x51,0), 0, 0) # 用win32api里的 keybd_event 来实现按键点击,0x51是 Q 的虚拟码
time.sleep(0.0001) # 设置延时 0.0001s (但具体是不是0.0001s我也感觉不到,反正随便调的)
win32api.keybd_event(0x51, MapVirtualKey(0x51,0), win32con.KEYEVENTF_KEYUP, 0) # 同上,但加了个 KEYEVENTF_KEYUP,表示按键弹起
t1 = Listener(on_press=on_presskey,on_release=on_releasekey) # 设置 监听 线程
t2 = threading.Thread(target=press_key,name='sendThreadkey') # 设置 点击 线程
t1.start() # 开始运行
t2.start()
os.system("pause")
于是我欢快地打开游戏开始测试
但
没一点用!
我猜测是按键模拟失效,经查证发现,win32 采用的是系统级模拟,而要想实现D3D游戏内操作需要驱动级模拟,所以,这个方法废了
接下来采用 keyboard 库来实现驱动级模拟操作
2 采用 keyboard 库实现操作
直接上代码
``
import keyboard
import threading
import time
flag = 0 # 判断什么时候开始按键
time1 = 0.001 # 延时
def on_presskey (name): # 监听
global flag
a = keyboard.KeyboardEvent('down',0,'F2') # 获取 F2(监听按键)的按键数据
if name != a: # 判断监听得到的按键数据跟 F2对应的按键数据 是否相等
flag = 0
print('没按对呢')
if name == a:
flag = 1
def press(): # 开始按键
global flag,time1
while True:
if flag == 1:
keyboard.send('2') # 就简单一行,实现模拟按键
time.sleep(time1) # 延时,去了这个将会一直按键下去,哪怕你松开也是一样
print('输出2')
keyboard.hook(on_presskey, ) # 主线程一直监听
t2 = threading.Thread(target=press,name='sendKey') # 次线程开始连按
t2.start()
测试效果不错,在文本编辑器上完美实现连按,按下就开始,不按就停
但
游戏里依然无效????
结语
啊 我放弃了,目前分析来看,是lol自己带的有保护,具体怎么过并没搜到解决方法。
但这次尝试还是学到了不少关于api的东西哈哈
结果最后还是回去用按键精灵了(哭)