السلام عليكم
انا مسوي بوت للعبة معينة و ابيه يضغط حبة او يرسل كلام او ينسخ كلام , الكود شغال لكن هذي المدخلات تأثر في كل جهاز , يعني اذا قلت له يلصق كلمة في المحادثة يسويها لكن اذا انا فتحت صفحة ثانية فهو بيسويها في الصفحة الي اخترتها . انا ابيه يسوي في اللعبة او البرنامج او في صفحة معينة ولا يأثر على كل الجهاز , جربت على محاكي الويندوز يضبط لكن مشكلة المحاكي بطيء و يستخدم من مصادر الجهاز.
*البوت ليس من اصل اللعبة البوت خارجي انا مسويه لارسال بعض المدخلات*
هل في طريقة اخليه يشتغل على برنامج معين و استخدم الجهاز بدون مشاكل ولا يزعجني البوت ؟
يجب أن تكون النافذة المستهدفة هي النافذة النشطة قبل إرسال أي إدخال لوحة المفاتيح، ويمكن تحقيق ذلك بعدة طرق.
1- يدويًا عن طريق التبديل إلى النافذة المستهدفة قبل بدء السيناريو، وذلك قد يكون أمرًا صعبًا في بعض الأحيان، ولكن سنضيف فترة انتظار في بداية الكود لمحاولة تجنب ذلك وضمان نجاح الإنتقال للنافذة قبل تنفيذ الكود الخاص بنا.
2- إذا كنت تستخدم نظام Windows، قم تثبيت حزمة pywin32 باستخدام "pip install pywin32"، ثم تشغيل سكريبت يشبه التالي للتأكد من أن التركيز قد تم تحويله إلى النافذة المستهدفة، ويجب عليك معرفة اسم النافذة المستهدفة والتأكد من عدم وجود نوافذ أخرى بنفس الاسم.
import keyboard
import win32gui
import win32con
import time
class WindowNotFoundError(Exception):
"""Error to be raised if window name is not found"""
pass
def focus_on_window(window_name):
def window_dict_handler(hwnd, top_windows):
"""Adapted from: https://www.blog.pythonlibrary.org/2014/10/20/pywin32-how-to-bring-a-window-to-front/
"""
if win32gui.IsWindowVisible(hwnd) and len(win32gui.GetWindowText(hwnd)) > 0:
top_windows[hwnd] = win32gui.GetWindowText(hwnd)
tw = {}
win32gui.EnumWindows(window_dict_handler, tw)
for handle in tw:
if tw[handle] == window_name:
win32gui.ShowWindow(handle, win32con.SW_NORMAL)
win32gui.BringWindowToTop(handle)
try:
win32gui.SetForegroundWindow(handle)
except Exception as e:
if e.__str__() == "(0, 'SetForegroundWindow', 'No error message is available')":
pass
else:
raise e
return None
raise WindowNotFoundError(f"WindowNotFoundError : The window name '{window_name}' does not appear to be an item in: {tw}")
if __name__ == "__main__":
# Example require fresh window instances of Notepad and Command Prompt
# Example call to program with the name "Untitled - Notepad" (windows default for new notepad instance) to top
focus_on_window("Untitled - Notepad")
# Safety sleep just in case our PC is slow to bring up the windowHello There!
time.sleep(1)
# Send our text into the window
keyboard.write("Hello There!")
# Example with CMD
time.sleep(1)
focus_on_window(r"Command Prompt")
time.sleep(1)
keyboard.write("python\nimport this\n")
لقيت الحل :
بحثت بنفسي :)
import win32gui,win32con,win32ui,time #المكتبات المستخدمة
#اظهار جميع الصفحات و اسمائهم و الايدي الخاص بهم
def list_widndows(hwnd,ctx):
if win32gui.IsWindowVisible(hwnd):
print(hex(hwnd),win32gui.GetWindowText(hwnd))
win32gui.EnumWindows(list_widndows,None) #طباعة جميع النوافذ اسمائها و الايدي الخاص بها في الجهاز
hwnd=win32gui.FindWindow(None,"Untitled - Notepad")#اختيار النافذة الاساسية المحددة
print("this: ",hwnd)
time.sleep(2)#انتظار كم ثانية لتنفيذ المهام
hwndex=win32gui.FindWindowEx(hwnd,None,None,None)# تحديد child من النافذة الاسياسة
print("hwndex: ",hwndex)#معرفة الايدي الخاص بchild
# بعض البرامج يكون لها child لاستقبال المدخلات و ليس النافذة الاسياسية و هذا يأخذ child للارسال المدخلات
#بعض البرامج يتغير العنوان الخاص بها فنطبع رقم child و نستخدمه
win32gui.PostMessage(hwndex,win32con.WM_KEYDOWN,0x44,0)# ضغط حرف D يساوي 0x44 في virtual key code
win32gui.PostMessage(hwndex,win32con.WM_KEYUP,0x44,0)#رفع عن ضغط حرف D
win32gui.PostMessage(1443862,win32con.WM_KEYDOWN,0x44,0)# ضغط حرف D يساوي 0x44 في virtual key code بإستخدام الايدي الخاص بchild
win32gui.PostMessage(1443862,win32con.WM_KEYUP,0x44,0)#رفع عن ضغط حرف D
التعليقات