Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.04;
Скачать: CL | DM;

Вниз

Как активизировать окно моего приложения?   Найти похожие ветки 

 
_ozzy_   (2008-04-07 14:18) [0]

После окончания продолжительного процесса нужно активизировать окно моего приложения, (программно щелкнуть по иконке в трее), на практике окно уже завалено другими окнами...

Сорри, дубль два...

Application.BringtoFront; только помигал в трее

SetActiveWindow(Application.Handle);
ShowWindow (Form1Glav.Handle, SW_SHOW);
Даже не помигали...


 
Skyle ©   (2008-04-07 14:25) [1]

SetForegroundWindow?


 
Leonid Troyanovsky ©   (2008-04-07 15:24) [2]


> _ozzy_   (07.04.08 14:18)  

> После окончания продолжительного процесса нужно активизировать
> окно моего приложения,

Не положено.

--
Regards, LVT.


 
ANB   (2008-04-07 15:53) [3]


> SetForegroundWindow?

Уже практически не ботает.


> Не положено.

+1. Впрочем, на XP у меня пляски с бубном в 90% случаев помогали.


 
ANB   (2008-04-07 15:55) [4]

Собственно, пляски :

procedure Set_Foreground_Window (hWindow : THandle);
var dwTimeout : DWord;
   hMainWindow, hFGW, hMDIClient : THandle;
begin
if (hWindow = 0) then Exit;
// Получим главное окно
hMainWindow := GetMainWindow(hWindow);
// Узнаем какое окно сейчас наверху
hFGW := GetForegroundWindow;
// Если не наше - будем поднимать
if (hMainWindow <> hFGW) then begin
 // Отключим моргание вместо подъема окна
 SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @dwTimeout, 0);
 SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, 0);
 try
  // Попробуем разными способами поднять окно
  SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_HOTKEY, LPARAM(hMainWindow));
  SwitchToThisWindow(hMainWindow, True);
  SetForegroundWindow(hMainWindow);
  // Для MDI окон
  if (hWindow <> hMainWindow) then begin
   // Найдем MDI Client
   hMDIClient := FindWindowEx(hMainWindow, 0, "MDIClient", "");
   // Пошлем ему сообщение WM_MDIACTIVATE
   SendMessage(hMDIClient, WM_MDIACTIVATE, hWindow, 0);
  end;
 finally
  // Восстановим моргание
  SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, @dwTimeout, 0);
 end;
end;
end;


 
Палач   (2008-04-07 15:55) [5]


> Leonid Troyanovsky ©   (07.04.08 15:24) [2]
>
> > _ozzy_   (07.04.08 14:18)  
>
> > После окончания продолжительного процесса нужно активизировать
>
> > окно моего приложения,
>
> Не положено.


?


 
ANB   (2008-04-07 16:02) [6]


> > Не положено.
>
>
> ?


МС сначала выдала функцию, а затем старательно блокирует ее работу, считая, что принудительный вывод какого то приложения на передний план без желания юзера есть нехорошо. Причем с каждой версией винды они последовательно рубят отработанные способы это сделать.


 
DVM ©   (2008-04-07 16:03) [7]

А у самой MS тем временем есть еще одна функция SwitchToThisWindow(), которой она пользуется сама.


 
Kolan ©   (2008-04-07 16:05) [8]

Имхо ненадо этого делать, надо просто помигать кнопочкой в таск баре, как это делают все культурные программы.


 
ANB   (2008-04-07 16:16) [9]


> надо просто помигать кнопочкой в таск баре

Иногда - надо именно передать фокус ввода. Например, при иммитации нажатий на кнопки. А моргание этому не поможет.


 
Kolan ©   (2008-04-07 16:31) [10]

> Например, при иммитации нажатий на кнопки.

Непонял, нажатий на кнопки чего?


 
Leonid Troyanovsky ©   (2008-04-07 18:15) [11]


> ANB   (07.04.08 15:55) [4]

> Собственно, пляски :

Если это условно-работоспособное решение,  то стоит ли стоять
двоим против ветра - оно ж обречено.

Ну, и если даже мы знаем 100% работоспособный метод, то публикуя его, рано или поздно мы добьемся убиения оного очередным сервиспаком.

--
Regards, LVT.


 
DVM ©   (2008-04-07 21:22) [12]


> Ну, и если даже мы знаем 100% работоспособный метод, то
> публикуя его, рано или поздно мы добьемся убиения оного
> очередным сервиспаком.

Как бы там ни было, но панель задач будет все равно пользоваться некой функцией для переключения окон. И она будет всегда. А узнать ее не очень сложно.


 
Leonid Troyanovsky ©   (2008-04-08 15:28) [13]


> DVM ©   (07.04.08 21:22) [12]

> Как бы там ни было, но панель задач будет все равно пользоваться
> некой функцией для переключения окон.

Для панели задач не нужно каких-либо функций кроме имеющихся,
бо, оное переключение не нарушает ограничений даже для SFW,
т.е., и последней вполне достаточно.

--
Regards, LVT.


 
DVM ©   (2008-04-08 15:37) [14]


> Для панели задач не нужно каких-либо функций кроме имеющихся,

Тем не менее, ее функция (я о SwitchToThisWindow) прекрасно подходит и для того, чтобы окну приложения выпрыгнуть самому на передний план и перехватить фокус ввода в любой момент. Может в будущем поведение и изменится, но оно не меняется уже 13 лет.



Страницы: 1 вся ветка

Текущий архив: 2008.05.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.005 c
3-1196612144
AlexeyMir
2007-12-02 19:15
2008.05.04
Ehlib CheckBoxes


2-1207738292
F@T@L_Err0r
2008-04-09 14:51
2008.05.04
Компоненты Сокет


3-1196411574
keymaster
2007-11-30 11:32
2008.05.04
Delphi+Oracle. Проблема с table of...


2-1207722300
saNat
2008-04-09 10:25
2008.05.04
Редактирование данных по сети


15-1206152154
Morpheuz
2008-03-22 05:15
2008.05.04
Цена делфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский