Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вытащить запущенный экземпляр.


Strate ©   (2007-05-14 17:27:00) 

Здравствуйте.

Такой вопрос. Хочу запретить запуск 2х компий моей программы, и если запускается вторая то выводить первый экземпляр из трея.

В трей прячу примерно так:

ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(frmMain.Handle, SW_HIDE);


Ну и там засовывание иконки и.т.п

Теперь, если запускается программа, то идёт проверка на предмет запущенности первого экземпляра, и если зупащено, то отсылаю окну сообщение.

В процедуре обработки сообщений главного окна есть проверка на приход моего сообщения при котором нужно корректно вытащить программу из трея, вывести его поверх остальных окон и сделать активным. Делаю так:

ShowWindow(Application.Handle, SW_NORMAL);
ShowWindow(frmMain.Handle, SW_NORMAL);
SetForegroundWindow(frmMain.Handle);


но работает это только один раз почему-то :(

т.е. я запустил второй экземпляр программы, свернул открывшеся окно, запускаю экзеншник ещё раз - и окно не выводится над всеми окнами, а начинает просто моргать кнопка на панели задач.

Вопрос: где я дурак?


Leonid Troyanovsky   (2007-05-14 20:41:00) [1]


> Strate ©   (14.05.07 20:02) [3]

>  nil) и ему отсылаю...

Вот, отсылка и оптимисична.
RTFM: msdn GetForegroundWindow & etc

--
Regards, LVT.


Strate   (2007-05-14 20:02:00) [2]

Leonid Troyanovsky ©   (14.05.07 19:30) [2]
Оптимистично, бо унаследовать foreground весьма непросто.


В смысле? Я просто ищу окно FindWindow('TMyMainFormClass', nil) и ему отсылаю...


Leonid Troyanovsky   (2007-05-14 19:30:00) [3]


> Strate ©   (14.05.07 17:27)  


> ShowWindow(Application.Handle, SW_HIDE);
> ShowWindow(frmMain.Handle, SW_HIDE);

Application.ShowMainForm := False;
ShowWindow(Application.Handle, SW_HIDE);

Показать (примерно) так:

procedure TForm1.RestroreClick(Sender: TObject);
begin
 Show;
 ShowWindow(Application.Handle, SW_HIDE); // если не нужна кнопка на панели
end;


> предмет запущенности первого экземпляра, и если зупащено,
>  то отсылаю окну сообщение.

Оптимистично, бо унаследовать foreground весьма непросто.

> Вопрос: где я дурак?

Попробуй так:

var
 h : HWND; // окно (главной) формы
begin
 h := GetWindowLong(wnd, GWL_HWNDPARENT); // окно приложения
 if IsIconic(h) then
   ShowWindow(h, SW_RESTORE);
 SetForegroundWindow(h);
 ..
end;


--
Regards, LVT.


Strate   (2007-05-14 17:29:00) [4]

Да, причём этот же метод отображения окна при дабл-клике на иконке в трее нормально работает. Но у меня складываетсятакое ощущение что при щелчке на иконке окно становится активным и выводится. А вот при запуске экзешника окно не активно и не выводится...


Наверх

Титульная страница Поиск, карта сайта Написать письмо