(未成功)用 Python 在LOL中 实现 可开关的按键连点

(未成功)用 Python 在LOL中 实现 可开关的按键连点

前言:

之所以想搞个这功能,主要是想玩一个无限插眼的BUG

地址:塞恩死亡真眼:无限插眼不耗层数,点亮坟头!(被动/死亡状态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的东西哈哈

结果最后还是回去用按键精灵了(哭)

原文地址:https://www.cnblogs.com/edwinaze/p/14985791.html