Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
_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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
15-1205553369
Матриц
2008-03-15 06:56
2008.05.04
Как повернуть вектор к вектору на определённый процент?


2-1207116031
Kolan
2008-04-02 10:00
2008.05.04
Неправильно загружается дизайн тайм пакет.


2-1207724584
ЛИЯ
2008-04-09 11:03
2008.05.04
как правильно задать фильтр


3-1196670098
Натуля
2007-12-03 11:21
2008.05.04
SQL Server - ADO Connection - Delphi


2-1207594006
Nemeziz
2008-04-07 22:46
2008.05.04
Запрет на выбор IITEMS в ComboBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский