Форум: "Основная";
Текущий архив: 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