Используя функцию waitforsingleobject ShellExecuteEx ПО и родительское окно теряет фокус, когда он вернется
Используя приведенный ниже код для запуска внешнего exe-файла, когда это приложение завершается, родительское окно теряет фокус. Я хочу отключить родительское окно, чтобы избежать каких-либо проблем с краской, и повторно активировать его, когда WaitForSingleObject будет завершен.
Есть ли какое-то решение для этого ? Что я делаю не так?
void CMainFrame::OnBtnUpdateApp() { SHELLEXECUTEINFO lpExecInfo; DWORD dwExitCode; HINSTANCE hProcess = 0; BOOL bResult; ZeroMemory(&lpExecInfo,sizeof(lpExecInfo)); lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; lpExecInfo.hwnd = GetSafeHwnd(); lpExecInfo.lpVerb = _T("open"); lpExecInfo.lpFile = _T("Update.exe"); lpExecInfo.lpParameters = _T(""); lpExecInfo.lpDirectory = _T(""); lpExecInfo.nShow = SW_SHOWNORMAL; lpExecInfo.hInstApp = NULL; lpExecInfo.hProcess = hProcess; bResult = ShellExecuteEx(&lpExecInfo); if(bResult) { EnableWindow(FALSE); WaitForSingleObject( lpExecInfo.hProcess, INFINITE ); if (!GetExitCodeProcess(lpExecInfo.hProcess, &dwExitCode)) { //failed to terminate normally } CloseHandle(lpExecInfo.hProcess); EnableWindow(TRUE); } else { //failed to execute the exe file } }
Что я уже пробовал:
Я пробовал, BringWindowToTop(), SetActiveWindow(), SetFocus()
[no name]
Попробуйте вызвать Activate после ожидания или ... до ожидания - сохраните HWND из GetFocus и (после ожидания) вызовите SetFocus на сохраненном HWND.
sdancer75
С помощью кода : hfocus его hwnd = ::GetFocus();метода enablewindow(false) в;функцию waitforsingleobject( lpExecInfo.hProcess, бесконечные );::setfocus для(hfocus);метода enablewindow(true); в казалось, не работали. Есть еще идеи ?
Frankie-C
Вы не можете установить фокус на отключенном окне. Включите окно, а затем установите фокус.
sdancer75
Да, это правда, моя ошибка.... но я уже сделал это, и это не сработало.
Во всяком случае, у меня есть некоторые мысли о родительском окне, которое вызывает shellexectute.
Если мое приложение является родительским окном, а приложение shellexecute-дочерним, будет ли переключение с помощью клавиш Alt+Tab отображать как родительские, так и дочерние приложения ? Это то, что происходит прямо сейчас, но я думаю, что он будет показывать только родительское окно правильно ? Имеет ли это какое-либо отношение к управлению фокусом?
Frankie-C
есть Много хитрых вещей, связанных с состоянием окна, вызывающим потоком и т. д.
Вы пробовали использовать SetForegroundWindow()?
sdancer75
Да, я использовал старую статью из codeproject, которая используется SetForegroundWindow (), но у меня все еще есть проблема. Теперь я работаю с CreateProcess, чтобы проверить, будет ли это работать для меня...
В любом случае, есть ли у вас какое-либо представление о вопросе для родительского/дочернего окна, если они появляются как одно приложение при переключении приложений windows ?
Frankie-C
Прочтите раздел ремарка в https://msdn.microsoft.com/en-us/library/windows/desktop/ms646291(v=против 85).aspx. Все дочерние окна являются частью цепочки включения/выключения верхнего окна, но с большим количеством деталей, как обычно в Win.
sdancer75
Что бы я ни пытался, мне это не удавалось. Я загрузил простой файл MFC/SDI, который использует CreateProcess для всех, кто хочет посмотреть и дать решение.
http://www.filedropper.com/shellexecutecreateprocesstestapp