Форум сайта python.su
Добрый день. помогите сделать чтобы автонажатие выбранных клавиш отправлялось в выбранное окно даже если оно не активно или свернуто
у меня оно выбирается в фокус и работает только так
import tkinter as tk from tkinter import ttk import pygetwindow as gw import win32gui import win32con import pyautogui import threading import time # Глобальная переменная для хранения последней нажатой клавиши и выбранного окна last_key = None selected_window_handle = None auto_press_thread = None stop_auto_press = False def update_window_list(): windows = gw.getWindowsWithTitle('') window_titles = [win.title for win in windows] window_titles = [title for title in window_titles if title] # Удаление пустых заголовков window_combobox['values'] = window_titles def on_select(event): global selected_window_handle selected_window_title = window_combobox.get() if selected_window_title: selected_window = gw.getWindowsWithTitle(selected_window_title) if selected_window: selected_window_handle = selected_window[0]._hWnd def confirm_selection(): global selected_window_handle selected_window_title = window_combobox.get() if selected_window_title: selected_window_label.config(text=f'Выбранное окно: {selected_window_title}') else: selected_window_label.config(text='Выберите окно из списка.') window_combobox.config(state='disabled') confirm_button.config(state='disabled') cancel_button.config(state='normal') # Активировать кнопку отмены def cancel_selection(): global selected_window_handle window_combobox.config(state='normal') confirm_button.config(state='normal') cancel_button.config(state='disabled') # Деактивировать кнопку отмены selected_window_label.config(text='Выберите окно из списка.') selected_window_handle = None # Сброс выбранного окна def add_key(): global last_key if last_key: keys_listbox.insert(tk.END, last_key) last_key = None # Сброс после добавления current_key_label.config(text='Текущая клавиша: None') def remove_key(): selected_index = keys_listbox.curselection() if selected_index: keys_listbox.delete(selected_index) def on_key_press(event): global last_key last_key = event.keysym current_key_label.config(text=f'Текущая клавиша: {last_key}') def send_key_to_window(key): if selected_window_handle: # Активировать окно win32gui.ShowWindow(selected_window_handle, win32con.SW_RESTORE) win32gui.SetForegroundWindow(selected_window_handle) # Отправить нажатие клавиши с помощью pyautogui pyautogui.press(key) def auto_press_keys(): global stop_auto_press while not stop_auto_press: for i in range(keys_listbox.size()): if stop_auto_press: break key = keys_listbox.get(i) send_key_to_window(key) time.sleep(0.1) # Задержка между нажатиями def toggle_auto_press(): global auto_press_thread, stop_auto_press if not auto_press_thread or not auto_press_thread.is_alive(): stop_auto_press = False auto_press_thread = threading.Thread(target=auto_press_keys) auto_press_thread.start() toggle_button.config(text='Остановить') else: stop_auto_press = True auto_press_thread.join() toggle_button.config(text='Начать') # Создание основного окна root = tk.Tk() root.title('Выбор активного приложения и клавиш') # Создание выпадающего списка window_combobox = ttk.Combobox(root) window_combobox.pack(padx=10, pady=5) # Создание строки для отображения выбранного окна selected_window_label = tk.Label(root, text='Выберите окно из списка.') selected_window_label.pack(padx=10, pady=5) # Обновление списка окон update_window_list() # Обработчик выбора элемента window_combobox.bind('<<ComboboxSelected>>', on_select) # Создание фрейма для кнопок выбора окна button_frame = tk.Frame(root) button_frame.pack(padx=10, pady=10, fill=tk.X) # Создание кнопки подтверждения confirm_button = tk.Button(button_frame, text='Подтвердить выбор', command=confirm_selection) confirm_button.pack(side=tk.LEFT, padx=(0, 5)) # Создание кнопки отмены выбора cancel_button = tk.Button(button_frame, text='Отменить выбор', command=cancel_selection, state='disabled') cancel_button.pack(side=tk.LEFT) # Создание фрейма для списка добавленных клавиш и кнопок управления key_frame = tk.Frame(root) key_frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True) # Создание списка добавленных клавиш keys_listbox = tk.Listbox(key_frame) keys_listbox.pack(side=tk.TOP, fill=tk.BOTH, expand=True) # Создание фрейма для кнопок добавления и удаления клавиш key_buttons_frame = tk.Frame(key_frame) key_buttons_frame.pack(pady=5, fill=tk.X) # Создание кнопки добавления клавиши add_key_button = tk.Button(key_buttons_frame, text='Добавить клавишу', command=add_key) add_key_button.pack(side=tk.LEFT, padx=(0, 5)) # Создание кнопки удаления клавиши remove_key_button = tk.Button(key_buttons_frame, text='Удалить клавишу', command=remove_key) remove_key_button.pack(side=tk.LEFT) # Создание метки для отображения текущей нажатой клавиши current_key_label = tk.Label(root, text='Текущая клавиша: None') current_key_label.pack(padx=10, pady=5) # Создание фрейма для кнопки начала/остановки автонажатия auto_press_frame = tk.Frame(root) auto_press_frame.pack(padx=10, pady=10, fill=tk.X) # Создание кнопки начала/остановки автонажатия toggle_button = tk.Button(auto_press_frame, text='Начать', command=toggle_auto_press) toggle_button.pack(side=tk.TOP, pady=10) # Расположить кнопку по центру с отступом # Привязка события нажатия клавиши для определения последней нажатой клавиши root.bind('<KeyPress>', on_key_press) # Запуск основного цикла обработки событий root.mainloop()
Отредактировано korolewski (Авг. 24, 2024 10:31:06)
Офлайн
Пробуй
import tkinter as tk from tkinter import ttk import pygetwindow as gw import win32gui import win32con import win32api import threading import time # Глобальная переменная для хранения последней нажатой клавиши и выбранного окна last_key = None selected_window_handle = None auto_press_thread = None stop_auto_press = False def update_window_list(): windows = gw.getWindowsWithTitle('') window_titles = [win.title for win in windows] window_titles = [title for title in window_titles if title] # Удаление пустых заголовков window_combobox['values'] = window_titles def on_select(event): global selected_window_handle selected_window_title = window_combobox.get() if selected_window_title: selected_window = gw.getWindowsWithTitle(selected_window_title) if selected_window: selected_window_handle = selected_window[0]._hWnd def confirm_selection(): global selected_window_handle selected_window_title = window_combobox.get() if selected_window_title: selected_window_label.config(text=f'Выбранное окно: {selected_window_title}') else: selected_window_label.config(text='Выберите окно из списка.') window_combobox.config(state='disabled') confirm_button.config(state='disabled') cancel_button.config(state='normal') # Активировать кнопку отмены def cancel_selection(): global selected_window_handle window_combobox.config(state='normal') confirm_button.config(state='normal') cancel_button.config(state='disabled') # Деактивировать кнопку отмены selected_window_label.config(text='Выберите окно из списка.') selected_window_handle = None # Сброс выбранного окна def add_key(): global last_key if last_key: keys_listbox.insert(tk.END, last_key) last_key = None # Сброс после добавления current_key_label.config(text='Текущая клавиша: None') def remove_key(): selected_index = keys_listbox.curselection() if selected_index: keys_listbox.delete(selected_index) def on_key_press(event): global last_key last_key = event.keysym current_key_label.config(text=f'Текущая клавиша: {last_key}') def send_key_to_window(key): if selected_window_handle: # Активировать окно win32gui.ShowWindow(selected_window_handle, win32con.SW_RESTORE) win32gui.SetForegroundWindow(selected_window_handle) # Преобразовать символьное значение клавиши в код виртуальной клавиши vk_code = win32api.VkKeyScan(key.upper()) # Отправить нажатие клавиши win32api.SendMessage(selected_window_handle, win32con.WM_KEYDOWN, vk_code, 0) win32api.SendMessage(selected_window_handle, win32con.WM_KEYUP, vk_code, 0) def auto_press_keys(): global stop_auto_press while not stop_auto_press: for i in range(keys_listbox.size()): if stop_auto_press: break key = keys_listbox.get(i) send_key_to_window(key) time.sleep(0.1) # Задержка между нажатиями def toggle_auto_press(): global auto_press_thread, stop_auto_press if not auto_press_thread or not auto_press_thread.is_alive(): stop_auto_press = False auto_press_thread = threading.Thread(target=auto_press_keys) auto_press_thread.start() toggle_button.config(text='Остановить') else: stop_auto_press = True auto_press_thread.join() toggle_button.config(text='Начать') # Создание основного окна root = tk.Tk() root.title('Выбор активного приложения и клавиш') # Создание выпадающего списка window_combobox = ttk.Combobox(root) window_combobox.pack(padx=10, pady=5) # Создание строки для отображения выбранного окна selected_window_label = tk.Label(root, text='Выберите окно из списка.') selected_window_label.pack(padx=10, pady=5) # Обновление списка окон update_window_list() # Обработчик выбора элемента window_combobox.bind('<<ComboboxSelected>>', on_select) # Создание фрейма для кнопок выбора окна button_frame = tk.Frame(root) button_frame.pack(padx=10, pady=10, fill=tk.X) # Создание кнопки подтверждения confirm_button = tk.Button(button_frame, text='Подтвердить выбор', command=confirm_selection) confirm_button.pack(side=tk.LEFT, padx=(0, 5)) # Создание кнопки отмены выбора cancel_button = tk.Button(button_frame, text='Отменить выбор', command=cancel_selection, state='disabled') cancel_button.pack(side=tk.LEFT) # Создание фрейма для списка добавленных клавиш и кнопок управления key_frame = tk.Frame(root) key_frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True) # Создание списка добавленных клавиш keys_listbox = tk.Listbox(key_frame) keys_listbox.pack(side=tk.TOP, fill=tk.BOTH, expand=True) # Создание фрейма для кнопок добавления и удаления клавиш key_buttons_frame = tk.Frame(key_frame) key_buttons_frame.pack(pady=5, fill=tk.X) # Создание кнопки добавления клавиши add_key_button = tk.Button(key_buttons_frame, text='Добавить клавишу', command=add_key) add_key_button.pack(side=tk.LEFT, padx=(0, 5)) # Создание кнопки удаления клавиши remove_key_button = tk.Button(key_buttons_frame, text='Удалить клавишу', command=remove_key) remove_key_button.pack(side=tk.LEFT) # Создание метки для отображения текущей нажатой клавиши current_key_label = tk.Label(root, text='Текущая клавиша: None') current_key_label.pack(padx=10, pady=5) # Создание фрейма для кнопки начала/остановки автонажатия auto_press_frame = tk.Frame(root) auto_press_frame.pack(padx=10, pady=10, fill=tk.X) # Создание кнопки начала/остановки автонажатия toggle_button = tk.Button(auto_press_frame, text='Начать', command=toggle_auto_press) toggle_button.pack(side=tk.TOP, pady=10) # Расположить кнопку по центру с отступом # Привязка события нажатия клавиши для определения последней нажатой клавиши root.bind('<KeyPress>', on_key_press) # Запуск основного цикла обработки событий root.mainloop()
Офлайн