Нужна помощь

korolewski

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

Форум IT Специалистов