Как управлять фокусом окна в Python или C++?

У меня есть задача по созданию автоматизации, и я разработал такой алгоритм:

1. Определить текущее активное окно (например, Chrome).
2. Активировать нужное окно (например, Блокнот).
3. Отправить горячую клавишу в Блокнот.
4. Вернуться к окну Chrome.

Однако я столкнулся с проблемой на втором шаге. Я не смог найти функцию WinAPI, позволяющую изменить активное окно, и сомневаюсь, существует ли такая функция. Если её нет, то единственным вариантом, который я вижу, является использование сочетания клавиш alt + tab, пока нужное окно не станет активным.

Я использую Python и C++, но предпочтение отдается решению на Python. В крайнем случае приму решение на C#, хотя и не хотел бы использовать .NET для этого приложения.
  • 12 октября 2024 г. 13:12
Ответы на вопрос 3
Для управления фокусом окон в Windows вы можете использовать библиотеку `pygetwindow` или `pyautogui` в Python, а в C++ вы можете использовать функции WinAPI. Давайте рассмотрим оба подхода.

### Решение на Python

Вот пример, как вы можете управлять фокусом окон с помощью библиотеки `pygetwindow` и `pyautogui`.

Установите необходимые библиотеки:

```bash
pip install pygetwindow pyautogui
```

Вы можете использовать следующий код:

```python
import pygetwindow as gw
import pyautogui
import time

# Функция, чтобы активировать окно по заголовку
def activate_window(title):
    try:
        window = gw.getWindowsWithTitle(title)[0]
        window.activate()
        return True
    except IndexError:
        print(f"Окно с заголовком '{title}' не найдено.")
        return False

# Шаг 1: Определите текущее активное окно
current_window = gw.getActiveWindow()
print(f"Текущее активное окно: {current_window.title}")

# Шаг 2: Активируйте нужное окно (например, Блокнот)
if activate_window('Блокнот'):
    time.sleep(1)  # немного подождите, чтобы убедиться, что окно активно

    # Шаг 3: Отправьте горячую клавишу в Блокнот (например, Ctrl + S)
    pyautogui.hotkey('ctrl', 's')
    
    # Шаг 4: Вернитесь к окну Chrome
    if current_window:
        current_window.activate()
```

Этот код позволит вам активировать нужное окно по названию и отправить в него горячие клавиши.

### Решение на C++

Для управления окнами в C++ нужно использовать WinAPI. Вот пример кода, который акцентирует на активации окна по заголовку:

```cpp
#include <windows.h>
#include <iostream>
#include <string>

bool activateWindow(const std::string& windowTitle) {
    HWND hwnd = FindWindowA(NULL, windowTitle.c_str());
    if (hwnd) {
        SetForegroundWindow(hwnd);
        return true;
    } else {
        std::cout << "Окно с заголовком '" << windowTitle << "' не найдено." << std::endl;
        return false;
    }
}

int main() {
    // Шаг 1: Определите текущее активное окно
    HWND currentWindow = GetForegroundWindow();
    char currentTitle[256];
    GetWindowTextA(currentWindow, currentTitle, sizeof(currentTitle));
    std::cout << "Текущее активное окно: " << currentTitle << std::endl;

    // Шаг 2: Активируйте нужное окно (например, Блокнот)
    if (activateWindow("Блокнот")) {
        Sleep(1000); // немного подождите, чтобы убедиться, что окно активно
        
        // Шаг 3: Отправьте горячую клавишу в Блокнот (например, Ctrl + S)
        keybd_event(VK_CONTROL, 0, 0, 0);
        keybd_event('S', 0, 0, 0);
        keybd_event('S', 0, KEYEVENTF_KEYUP, 0);
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
        
        // Шаг 4: Вернитесь к текущему окну
        SetForegroundWindow(currentWindow);
    }

    return 0;
}
```

### Описание:

1. В Python используется библиотека для получения и управления окнами, что значительно упрощает задачу.
2. В C++ реализуется поиск окна по заголовку и смена фокуса с использованием WinAPI, что требует больше кода, но даёт контроль на низком уровне.

Эти примеры покажут, как управлять активными окнами, и вы сможете адаптировать их под свои нужды.
Похожие вопросы