(未成功)用 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的東西哈哈
結果最后還是回去用按鍵精靈了(哭)