Объединение CreateProcess и AllowSetForegroundWindow в WIN32 - PullRequest
1 голос
/ 24 ноября 2011

У меня есть приложение, которое по сути является «вспомогательным» приложением, которое упаковывает другое приложение.

Приложение, с которым взаимодействует пользователь, представляет собой процесс, который создается приложением-помощником так:

PROCESS_INFORMATION processInfo;
STARTUPINFO startupInfo;
memset(&processInfo, 0, sizeof(processInfo));
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
startupInfo.dwFlags = STARTF_USESTDHANDLES;
startupInfo.cb = sizeof(startupInfo);
int retval = CreateProcess(cmd, cmdLine, NULL, NULL, false,
    CREATE_NO_WINDOW, NULL, NULL, &startupInfo,
    &processInfo);

Этот процесс является исполняемым файлом, к которому у меня нет исходного кода, и я не могу вносить в него изменения.

Приложение-помощник делает несколько вещей, основанных в основном на сетевом трафике из другого приложения. В какой-то момент я хочу отобразить диалоговое окно просмотра файлов из вспомогательного приложения на основе того, что пользователь делает в запущенном процессе пользовательского интерфейса.

Когда я показываю диалог файла из вспомогательного приложения, он отображается за пользовательским интерфейсом созданного процесса, что не идеально. Я попытался вызвать SetForegroundWindow () из вспомогательного приложения, но оно не соответствует критериям, указанным для SetForegroundWindow в документах MSDN (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539%28v=vs.85%29.aspx), а именно:

Процесс не является приоритетным процессом.

Процесс не был запущен процессом переднего плана.

(хотя процесс создал процесс переднего плана).

Есть ли способ вызвать CreateProcess () с флагом или параметром, который работает как вызов AllowSetForegroundWindow () из этого процесса? Или флаг, который можно использовать, чтобы заставить Windows думать, что запущенный процесс «совпадает» с процессом, который запустил его в целях разрешений SetForegroundWindow?

Или есть другой способ показать диалог, созданный вспомогательным приложением, поверх диалогов созданного процесса?

1 Ответ

0 голосов
/ 24 ноября 2011

Единственное решение, которое я мог бы придумать, было бы сделать удаленную инъекцию потока в дочерний процесс, а затем получить вызов встроенного потока AllowSetForegroundWindow с соответствующими параметрами, чтобы родительский процесс мог украсть передний план. назад.

Я не проверял это все же.

...