2014-12-19 2 views
4

Я создал дочерний процесс из консольного приложенияДетский процесс крадет фокус. Как вернуть его, не беспокоя пользователя?

CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &in, &out); 

Где

  • command является командной строки для приложения я бегу pvw32 img.jpg (pictView, чтобы показать некоторые изображения).
  • in является STARTUPINFO структура (я пытался STARTF_USESHOWWINDOW флаг, но вот незадача, pictView крадет фокус некоторые из его ПРОЦЕССОВ)

Я попытался дать pictView некоторое время, а затем любезно принять фокус назад

Sleep(1000); 
SwitchToThisWindow(hwnd,TRUE); 

Я получил фокус (курсор снова мигает в моей консоли), но значок на панели задач несколько раз мигает, и вход не разрешен, пока я не нажму Alt + Tab.

Я также попытался установить z-порядок, чтобы сфотографировать pictView, даже чтобы приостановить его, но он просто не хочет легко сдаваться. Единственный способ вернуть фокус - убить pictView.

Есть ли способ вернуть фокус, не беспокоя пользователя с помощью Alt + Tab?

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

+0

Вы можете попробовать установить STARTUPINFO.wShowWindow в SW_SHOWNOACTIVATE. Однако это лишь намек на процесс, он не должен его использовать. –

+0

Помимо использования флага 'STARTF_USESHOWWINDOW', вы также установили значение' wShowWindow' структуры 'STARTUPINFO' в нечто вроде' SW_SHOWNOACTIVATE' или 'SW_SHOWMINNOACTIVATE'? –

+0

Да, я попробовал, но pictView просто игнорирует его. Мне интересно, может ли быть способ запустить pictView в какой-то песочнице, которая учит его процессу хороших манер? –

ответ

6

Как отмечает Реми Лебо, SetForegroundWindow() описывает требования по установке переднего плана переднего плана. pictView играл грязно, так что я used dirty tricks too:

LockSetForegroundWindow(LSFW_LOCK); 

выполнена из консольного приложения предотвращено pictView украсть свое внимание. Теперь все идет гладко.

Смежные вопросы