C ++ CreateProcess SW_HIDE Firefox, Chrome, Safari - PullRequest
0 голосов
/ 13 декабря 2010

Я пишу среду веб-тестирования для окон, которая использует несколько браузеров для тестирования веб-приложений.Я хочу запустить скрытые браузеры, но они не работают.

Я использую CreateProcess для запуска браузеров с флагом SW_HIDE

STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
CreateProcess(NULL, const_cast<char*> (cmd.c_str()) , NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

Он отлично работает для Internet Explorer и других приложений,но терпит неудачу с Firefox и другими браузерами.Я знаю, что процесс может выбирать, следовать ли пройденным флагам или нет.Можно ли каким-то образом заставить его начать скрываться?

Я, вероятно, могу подождать, пока не появится окно, а затем спрятать его, получив ручку к открытому окну.Но я ищу более чистое решение.

Ответы [ 5 ]

1 голос
/ 23 декабря 2010

Проблема в том, что значение wShowWindow используется только тогда, когда функция ShowWindow вызывается с командой SW_SHOWDEFAULT, кроме того, как сказал FastAl, браузер создает дополнительный процесс для выполнения дополнительных задач.
На основеПо вашей идее и ответу FastAl, вы можете сделать это, чтобы скрыть окна, созданные процессом, который вы создали:
1.- Создайте список процессов с помощью: CreateToolhelp32Snapshot, Process32First, Process32Next иCloseHandle;брать только процесс, который был создан процессом, который вы создали. Здесь является демонстрацией того, как использовать эти функции, он работает с любой версией Windows, кроме Windows NT.
2.- Используйте EnumWindows, чтобы Перечислить окна на экране и с проверкой GetWindowThreadProcessIdесли окна были созданы любым из процессов, восстановленных на предыдущем шаге.
3.- Если окна были созданы одним из процессов, определенных на шаге 1;скрыть окна с помощью функции ShowWindow.
Вы можете отслеживать созданный вами процесс и проверять, создаются ли новые процессы / окна.

0 голосов
/ 22 декабря 2010

Вы можете запустить приложение и затем отправить сообщение WM_SIZE в главное окно.

http://msdn.microsoft.com/en-us/library/ms632646(v=vs.85).aspx

0 голосов
/ 20 декабря 2010

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

Другой вариант - сделать что-то с оконными станциями и рабочими столами, взгляните на раздел о оконных станциях и рабочих столах на MSDN . Идея состоит в том, чтобы использовать CreateDesktop , а затем указывать этот рабочий стол в качестве параметра lpDesktop в структуре STARTUPINFO, данной CreateProcess. Если позднее вы захотите отобразить пользовательский интерфейс, используйте SwitchDesktop .

0 голосов
/ 22 декабря 2010

try si.wShowWindow = 0;забавно, что это сработало для меня, а не SW_HIDE, который должен иметь то же значение.

0 голосов
/ 13 декабря 2010

Согласно MSDN , похоже, вам нужно передать этот флаг в dwFlags.

STARTF_USESHOWWINDOW 0x00000001 - The wShowWindow member contains additional information.
...