以前はpython3を使用してゲーム自動化スクリプトを作成しましたが、多くのものを使用し、最終的に完全なソリューションが得られました。ここでコアアイデアについて自由に詳しく説明してください。
ゲーム支援フォームデザイン:
pyqtのような大きなソフトウェアは必要ありません。組み込みのtkinterを使用して小さなツールを作成するだけです。もちろん、コードを入力するのは純粋に手作業ではなく、ドラッグアンドドロップで実行できます。なぜ、tkinterがVBのように、インターフェイスをドラッグすることでコードを生成できることをご存知ですか?
ハハ、PAGEが調べます。
ゲーム支援アプリケーションのリリース:
当然、pyinstallerにパッケージされた32ビットバージョンのexeとして、プログラムアイコンとバージョン情報とともにリリースされました。
ゲームのコアシミュレーションの側面:
もちろん、それはコードを手でノックすることによってではなく、現在市場に出ている強力なdllプラグインを呼び出すことによって達成されます。たとえば、DamoプラグインやLewanプラグインなどのcomコンポーネント。言い換えると、Easy Languageの一部のモジュールは、windllにコンパイルして呼び出すことができます。
補助フォームのホットキー登録:
これらは、win32のもので実現される低レベルのものを使用する必要があり、グローバルホットキーを登録できます。原則として、ホットキーの押下を検出するために単一のスレッドが使用され、ホットキーが押された後、必要な機能を実行するために別のスレッドが開かれます。ネイティブのものは書くのが難しすぎるという事実を考慮して、私は自分でデモをカプセル化して書きました。グローバルキーの組み合わせと個々のホットキーの登録は問題ありません。
慈悲深い人は最初の3つの側面について異なる見解を持っています。後者のコアソースコードを投稿して、後で見つからないようにします。
以下に新しいコードを投稿してください。
#! /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,time
classHotkey(Thread):
user32 = ctypes.windll.user32
hkey_list ={}
hkey_flags ={} #押す
hkey_running ={} #開始および停止
_ reg_list ={} #登録するホットキー情報
def regiskey(self, hwnd=None, flagid=0, fnkey=win32con.MOD_ALT, vkey=win32con.VK_F9): #ホットキーを登録します。デフォルトは1つです。+F9
return self.user32.RegisterHotKey(hwnd, flagid, fnkey, vkey)
def get_reginfo(self):return self._reg_list
def get_id(self,func):
self_id = None
for id in self.get_reginfo():if self.get_reginfo()[id]["func"]== func:
self_id = id
breakif self_id:
self.hkey_running[self_id]= True
return self_id
def get_running_state(self,self_id):if self.hkey_running.get(self_id):return self.hkey_running[self_id]else:return False
def 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 id
def fast_reg(self,id,key =(0,win32con.VK_HOME),func = lambda:print('ホットキー登録開始')):if not self.regiskey(None, id, key[0], key[1]):print("ホットキーの登録に失敗しました")return None
self.hkey_list[id]= func
self.hkey_flags[id]= False
return id
def callback(self):
def inner(self = self):for flag in self.hkey_flags:
self.hkey_flags[flag]= False
while 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]= False
return inner
def 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]= True
self.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]= False
print(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)) #開始する代替ホームボタン
hotkey.reg(key =(0,win32con.VK_END),func=stop_jump,args=(start_id,hotkey)) #altエンドキーエンド
hotkey.start() #ホットキーのメインスレッドを開始します
print(f"現在のスレッドの総数:{activeCount()}")print('現在のスレッドリスト:',enumerate())print('ホットキー登録が初期化されたら、キーの組み合わせaltを押してみてください+ホームキーまたはシングルキー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 inrange(2)] #2つのホットキーシーケンスを作成します
h_keys ={i: False for i in h_ids} #すべてのホットキーシーケンスをFalseに初期化します
h_dict ={} #空の辞書、レコードID、および関数を初期化します
classHotkey(Thread): #スレッドの拡張クラスを作成します
user32 = ctypes.windll.user32 #user32をロードします.dll
# global h_ids, h_keys,h_dict
def regiskey(self, hwnd=None, flagid=0, fnkey=win32con.MOD_ALT, vkey=win32con.VK_F9): #ホットキーを登録します。デフォルトは1つです。+F9
return self.user32.RegisterHotKey(hwnd, flagid, fnkey, vkey)
def callback(self, id, func):
h_dict[id]= func #このIDはこの関数に対応します。追加されていない場合は、追加されている場合は変更されます。
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) #さらに、スレッドを開いて値を実行します
h_keys[h_ids[key]]= False
return inner
def 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]= True
self.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_dict
timer_dict[tmrname]= flag
print("tqtimerの有効状態がに設定されています:{}".format(flag))
def inner():
global timer_dict
if timer_dict[tmrname]:func()Timer(sec, inner).start()thread_it(inner)
def clearinterval(timername):
global timer_dict
timer_dict[timername]= False
flag = 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:
pass
if __name__ =='__main__':run_ok()
これがインターフェースのないソースコードなので、メインスレッドの無限ループをブロックしました。実行後、alt + F9を押すと開始ボタンが印刷され、F10を押すと停止ボタンが印刷されます。
tkinterで実行している場合は、run_ok関数の背後にあるwhile True:passを削除してから、init関数にrun_ok()を追加します。これは、PAGEで設計されたtkinterプログラムを指します!
その後、フォームの作成時にメインスレッドが自動的にブロックされ、ホットキーを監視する他のスレッドはメインスレッドで終了します。起動期間中、独立した操作は互いに干渉しません。
これまで、python3登録グローバルホットキーの実装に関するこの記事を紹介しました。関連するpython3登録グローバルホットキーについては、ZaLou.Cnの以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後もZaLouをサポートしていただければ幸いです。 .Cn!
Recommended Posts