Я делаю плеер YouTube, и мне нужно следующее:
Откройте новый процесс браузера и откройте в нем ссылку.
Подождите, пока все это загрузится
Свернуть окно
мне также нужно: При нажатии 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++ обеспечивает механизм исключений для обработки ошибок и исключительных ситуаций.