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

Вниз

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

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

Наверх




Память: 0.46 MB
Время: 0.055 c
15-1181701955
Slider007
2007-06-13 06:32
2007.07.15
С днем рождения ! 11 июня 2007 понедельник


15-1181601761
Kostafey
2007-06-12 02:42
2007.07.15
Вопрос к модераторам


2-1182106911
Dmitryfox
2007-06-17 23:01
2007.07.15
Как изменить дату фотографии ?


2-1182024536
ММК
2007-06-17 00:08
2007.07.15
USB-флешка


2-1181502728
Golikov
2007-06-10 23:12
2007.07.15
как запустить стандартный просмоторщик изображений и факсов Windo





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