Как активизировать окно?
От: utah Россия  
Дата: 26.03.03 11:29
Оценка:
Привет!
Вопрос конечно больше винапишный, но...
Допустим у меня есть оконное приложение сразу же после запуска идёт WaitForSingleObject(hHandle,dwMilliseconds);
Далее переводим наше приложение в бэкграунд и в другом приложении устанавливаем hHandle. Что надо выполнить в первом процессе (после WaitForSingleObject), чтобы его окно стало активным?
Или проще как сделать оконный процесс (из него же) активным?

Заранее спасибо.



26.03.03 14:42: Перенесено из 'C/C++'
Re: Как активизировать окно?
От: Amor Россия  
Дата: 26.03.03 11:31
Оценка:
Здравствуйте, utah, Вы писали:

U> Привет!

U> Вопрос конечно больше винапишный, но...
U> Допустим у меня есть оконное приложение сразу же после запуска идёт WaitForSingleObject(hHandle,dwMilliseconds);
U>Далее переводим наше приложение в бэкграунд и в другом приложении устанавливаем hHandle. Что надо выполнить в первом процессе (после WaitForSingleObject), чтобы его окно стало активным?
U> Или проще как сделать оконный процесс (из него же) активным?

U>Заранее спасибо.


SetForegroundWindow( свой хэндл окна )
Вроде так...
Re[2]: Как активизировать окно?
От: Frostbitten Россия  
Дата: 26.03.03 11:52
Оценка:
Здравствуйте, Amor, Вы писали:

A>SetForegroundWindow( свой хэндл окна )

A>Вроде так...

Так-то оно так, но для ::SetForegroundWindow() куча ограничений в win98+, win2000+ — так просто кому угодно это сделать не позволят (и это, вообще-то, правильно).

В общем, в MSDN перечисленно несколько способов удачной установки foreground'ности — там можно поискать статью "Foreground and Background Windows". Самый грубый и эффективный способ, это вернуться к win95-like поведению — то есть позволить всем ::SetForegroundWindow():

#if !defined(SPI_SETFOREGROUNDLOCKTIMEOUT)
   #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001
#endif

::SystemParametersInfo(
   SPI_SETFOREGROUNDLOCKTIMEOUT ,
   0 ,
   (LPVOID)0 ,                      // 0 мс
   SPIF_SENDCHANGE);


По крайней мере я только просле этого обрем покой. Если кто знает стольже эффективные и столько универсальные методы (именно по этой причине ::AllowSetForegroundWindow() не катит) буду благодарен.
http://files.rsdn.org/11737/fish.gif
Re[2]: Как активизировать окно?
От: Vamp Россия  
Дата: 26.03.03 11:54
Оценка:
Здравствуйте, Amor, Вы писали:


A>SetForegroundWindow( свой хэндл окна )

Есть такая прикольная особенность у этой функции, что окно не обязательно переведется на передний план. В некоторых случаях начинает мигать кнопка этого приложения на таскбаре. Сделано для того, чтобы пользователю в момент, скажем, печатания некоего текста не подсовывали всякие левые окна.
Да здравствует мыло душистое и веревка пушистая.
Re: Как активизировать окно?
От: vasketsov Россия http://ntprog.by.ru
Дата: 26.03.03 16:04
Оценка: 49 (3)
Здравствуйте, utah, Вы писали:

U> Или проще как сделать оконный процесс (из него же) активным?

Вот. Работает даже с учетом последних фиксов на 2000-ю винду (без них можно опустить SetActiveWindow)

Пишу на Delphi, разберешься.
Сишного кода сейчас под рукой нет, переписывать лень.

function MyBringWindowToTop(hWnd:HWND):Boolean;
var iMyTID , iCurrTID: Integer;
begin
Result := FALSE;
iMyTID := GetCurrentThreadId();
iCurrTID := GetWindowThreadProcessId(GetForegroundWindow(),nil);

if (AttachThreadInput(iMyTID, iCurrTID, TRUE)) then
begin
SetForegroundWindow(hWnd);
SetWindowPos(hWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
SetActiveWindow(hWnd);
BringWindowToTop(hWnd);
SetFocus(hWnd);
AttachThreadInput(iMyTID, iCurrTID, FALSE);
Result := TRUE;
end;
end;

Если вызывать из дельфевой программы, то вызов примерно такой должен быть (из MainForm):

If Application.Minimized then
Application.Restore;
MyBringWindowToTop(Application.Handle);
MyBringWindowToTop(Handle);

Если из сишной — то так.

if IsIconic(hMainWindow)
SendMessage(hWnd,WM_SYSCOMMAND,SC_RESTORE,0);

MyBringWindowToTop(hMainWindow);
Васкецов Сергей
http://registry.km.ru
Re[2]: Как активизировать окно?
От: vasketsov Россия http://ntprog.by.ru
Дата: 11.04.03 02:49
Оценка:
Здравствуйте, vasketsov, Вы писали:

Обновленный вариант — заменить BringWindowToTop(hWnd) на ShowWindow(hWnd, SW_SHOW)
Ибо M$ не стоит на месте , опять нашлась ситуация, где это не совсем корректно работало.
Васкецов Сергей
http://registry.km.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.