ShowWindowAsync не активирует скрытое + свернутое окно? - PullRequest
1 голос
/ 27 сентября 2011

Данное внешнее (не принадлежащее текущему процессу) окно (hWnd) сначала свернуто, а затем скрыто:

ShowWindowAsync(hWnd, SW_MINIMIZE);
// wait loop inserted here
ShowWindowAsync(hWnd, SW_HIDE);

Следующий вызов правильно восстанавливает его до минимального (восстановленного) состояния:

ShowWindow(hWnd, SW_RESTORE);

Однако этот вызов не:

ShowWindowAsync(hWnd, SW_RESTORE);

Во втором случае с ShowWindowAsync() окно не свернуто и больше не скрыто, но не активировано (остается за другими существующими окнами). И наоборот, первый вызов ShowWindow() правильно активирует окно.

Это ожидаемое поведение? Как восстановить окно (на передний план), не полагаясь на ShowWindow(), который является синхронным (блокирующим)? (цикл ожидания в примере может иметь тайм-аут, в то время как ShowWindow() не позволяет указание времени ожидания.)

(WinXP SP3)

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Вот решение, которое используется:

ShowWindowAsync(hWnd, SW_SHOW);
// wait loop inserted here
ShowWindowAsync(hWnd, SW_RESTORE);

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

ShowWindowAsync(hWnd, SW_MINIMIZE);
// wait loop inserted here
ShowWindowAsync(hWnd, SW_HIDE);
1 голос
/ 27 сентября 2011

ShowWindowAsync отправляет событие show-window в очередь сообщений данного окна.В частности, окно отображается его потоком, а не вашим потоком.И разница в том, что ваш поток является основным потоком и поэтому может активировать другое окно, которое он не может сделать сам.

...