Главная страница
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.47 MB
Время: 0.014 c
15-1181874194
Slider007
2007-06-15 06:23
2007.07.15
С днем рождения ! 15 июня 2007 пятница


2-1182680629
Gringoire
2007-06-24 14:23
2007.07.15
Программный клик


2-1182625728
Gringoire
2007-06-23 23:08
2007.07.15
Картинки и БД


2-1182073927
..::KraN::..
2007-06-17 13:52
2007.07.15
String to ANSI


2-1182004561
Ral'f
2007-06-16 18:36
2007.07.15
Как с помощью TDBComboBox-ов фильтровать содержимое DBGrid?