Добрый день. помогите сделать чтобы автонажатие выбранных клавиш отправлялось в выбранное окно даже если оно не активно или свернуто
у меня оно выбирается в фокус и работает только так
у меня оно выбирается в фокус и работает только так
Код:
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()
Последнее редактирование: