Как грамотно открыть и управлять браузером с помощью WinAPI

Я делаю плеер YouTube, и мне нужно следующее:

  1. Откройте новый процесс браузера и откройте в нем ссылку.

  2. Подождите, пока все это загрузится

  3. Свернуть окно

мне также нужно: При нажатии PAUSE ставит видео на паузу, при нажатии Play возобновляет воспроизведение.

Проблема: Я действительно могу запустить процесс командой CreateProcess, но не могу определить состояние: загрузилось окно или нет. Потому что если я сверну окно, но видео или браузер не закроются, то оно либо не будет работать, либо видео не начнет воспроизводиться. У меня сон не работает, так как на разных компьютерах и в зависимости от скорости интернета пользователя окно и видео могут загружаться в разное время, поэтому тут угадать невозможно.

Я также столкнулся с проблемой поиска окна. Когда я открываю процесс и пытаюсь найти окно браузера (EnumWindows), он его чаще всего не находит. Еще пробовал использовать перечисление всех окон и сопоставление ProcessId - тоже не получилось.

Ниже я привел некоторый код из своих попыток (примитивно сделанный специально для тестирования):

Создание процесса:

#include <iostream>
#include <string>
#include <Windows.h>

struct handle_data {
    unsigned long process_id;
    HWND window_handle;
};

BOOL CALLBACK enum_windows_callback(const HWND handle, const LPARAM lParam)
{
    handle_data& data = *reinterpret_cast<handle_data *>(lParam);
    unsigned long process_id = 0;
    GetWindowThreadProcessId(handle, &process_id);
    if (data.process_id != process_id)
        return TRUE;
    data.window_handle = handle;
    return FALSE;
}

HWND find_main_window(unsigned long process_id)
{
    handle_data data{};
    data.process_id = process_id;
    data.window_handle = nullptr;
    EnumWindows(enum_windows_callback, reinterpret_cast<LPARAM>(&data));
    return data.window_handle;
}

int main() {
    const char* chromePath = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
    std::string command = std::string(chromePath) + " --new-window " + url;

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    if (!CreateProcess(
        NULL,
        const_cast<LPSTR>(command.c_str()),
        NULL,
        NULL,
        FALSE,
        0,
        NULL,
        NULL,
        &si,
        &pi))
    {
        std::cerr << "CreateProcess failed with error code " << GetLastError() << std::endl;
        return 1;
    }

    HWND hwnd = find_main_window(pi.dwProcessId);

    if (hwnd != NULL) {
        std::cout << "Found window handle: " << hwnd << std::endl;
    } else {
        std::cout << "Window not found." << std::endl;
    }

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return 0;
}

Вот я и пытался найти окно запущенного процесса (почему-то не получается). Я тоже считаю, что это примитивный подход и не учитывает большое количество моментов, но другого способа я не знаю.

На самом деле все это мне нужно для управления этим окном в дальнейшем (пауза, воспроизведение и т.д.).

Можете ли вы подсказать другие методы, кроме винапи, может быть есть более эффективные способы сделать то, что я описал выше?

Мне также необходимо принять во внимание, что у пользователя может быть запущено несколько процессов браузера.

🤔 А знаете ли вы, что...
C++ обеспечивает механизм исключений для обработки ошибок и исключительных ситуаций.


73
1

Ответ:

Решено

Лучший подход — использовать встроенный браузер webview2.