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

Вниз

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

 
Strate ©   (2007-05-14 17:27) [0]

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

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

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

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


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

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

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

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


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

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

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


 
Strate ©   (2007-05-14 17:29) [1]

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


 
Leonid Troyanovsky ©   (2007-05-14 19:30) [2]


> 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 20:02) [3]

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


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


 
Leonid Troyanovsky ©   (2007-05-14 20:41) [4]


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

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

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

--
Regards, LVT.



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

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

Наверх




Память: 0.48 MB
Время: 0.014 c
2-1182092381
Knob
2007-06-17 18:59
2007.07.15
Смещение компонентов Canvas


2-1182061118
Лысеющий Самурай
2007-06-17 10:18
2007.07.15
HotKeys


2-1182164931
vima
2007-06-18 15:08
2007.07.15
Загрузка запроса из файла.


2-1181915779
XeON
2007-06-15 17:56
2007.07.15
Имена файлов


15-1182165213
ILUT
2007-06-18 15:13
2007.07.15
Задать положение компонента