• (未成功)用 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的东西哈哈

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

  • 相关阅读:
    Java程序性能优化——让你的java程序更快、更稳定
    synchronized和ReentrantLock
    Java集合——ConcurrentHashMap
    SpringMVC流程
    计算机网络http,https,tcp,udp,get,post
    JVM类加载机制
    关于strcpy和memcpy
    C语言指针
    malloc函数详解
    进程和线程
  • 原文地址:https://www.cnblogs.com/edwinaze/p/14985791.html
Copyright © 2020-2023  润新知