![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по вызову программы из трея. [D7, WinXP]
Руслана © (2005-01-30 00:45:00)Тут уже мелькал подобный вопрос, но к сожалению, ответы на него мне не помогли.
Имеется приложение. С помощью компонента CoolTray оно живет в трее (большую часть времени). Необходимо чтобы при попытке запуска второй копии востанавливалось приложение которое уже сидит в трее (конечно, если сидит). Мне кажется, что лучше всего использовать собственные сообщения. То есть при наличии в трее первой копии послать ей сообщение что надо восстановится. Но с практической реализацией не получается. Вот код - помогите зарегистрировать собственное сообщение и покажите как его послать и отловить. Заранее благодарна...
program TahionN;
uses
Forms,
Windows,
Messages,
Dialogs,
{$R *.res}
var
UniqueMapping:THandle;
h:hWnd;
Handle2 : LongInt;
begin
UniqueMapping:= CreateFileMapping($ffffffff, nil, PAGE_READONLY, 0, 32, 'MyMap');
if UniqueMapping = 0 then
begin
ShowMessage('Ошибка выделения памяти');
Halt;
end
else if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('Программа уже запущена');
h:=FindWindow(nil, 'Tahionn');
Handle2 := GetWindow(h,GW_OWNER);
ShowWindow(Handle2,SW_Show);
ShowWindow(Handle2,SW_RESTORE);
SetForegroundWindow(h); // Активизиpуем
Halt;
end;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TDataModule1, DataModule1);
Application.CreateForm(TFormInfo, FormInfo);
Application.CreateForm(TFormOption, FormOption);
Application.CreateForm(TFormErase, FormErase);
Application.CreateForm(TFormDTMFPass, FormDTMFPass);
Application.CreateForm(TFormProgramm, FormProgramm);
Application.Run;
end.
Руслана (2005-01-30 15:00:00) [1]Всем большое спасибо, разобралась, все работает!
a.denisov (2005-01-30 12:53:00) [2]project dpr1;
uses
Forms, Windows,
main in 'main.pas' {Form1};
function ActivatePrevInstance: Boolean;
var
PrevInstWnd, PrevInstAppWnd: THandle;
begin
PrevInstWnd := FindWindow(PChar(string(TForm1.ClassName)), nil);
Result := PrevInstWnd <> 0;
if Result then begin
SetWindowPos(PrevInstWnd, HWND_TOP, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE or SWP_SHOWWINDOW);
SetForegroundWindow(PrevInstWnd);
BringWindowToTop(PrevInstWnd);
PrevInstAppWnd := FindWindow(nil, 'MyAppTitle');
ShowWindow(PrevInstAppWnd, SW_SHOWNORMAL);
SetForegroundWindow(PrevInstAppWnd);
BringWindowToTop(PrevInstAppWnd);
end
else
SetWindowText(Application.Handle, 'MyAppTitle');
end;
begin
if not ActivatePrevInstance then begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
Fay (2005-01-30 07:21:00) [3]2 Руслана (30.01.05 3:24) [54][Ответить]
Просыпайся, соня! Тебе письмо с фронта. 8)
Руслана (2005-01-30 03:24:00) [4]пробовала еще раньше - все равно не работает.
Пора спать идти - завтра продолжим :)...
olookin (2005-01-30 03:13:00) [5]Все же не понимаю я;
Handle2 := GetWindow(h,GW_OWNER);
ShowWindow(Handle2,SW_Show);
ShowWindow(Handle2,SW_RESTORE);
На кой?
h уже есть - так его и передавать как парметр для ShowWindow
Руслана (2005-01-30 03:10:00) [6]конечно посмотрю, уже качаю
i-s-v (2005-01-30 03:06:00) [7]Если охота разбираться в чужом коде - загляни на мой сайт: http://i-s-v.org.ua, там есть программа QLoader (в которой я делал что-то типа такого)
Руслана (2005-01-30 03:03:00) [8]Пробовала уже посылать WM_Close - не закрывает окно.
А GetLastError пишет Innaccesible value.
Кстати когда посылаю WM_Close возвращаетмся не 0... в отличии от WM_user
olookin (2005-01-30 03:00:00) [9][48] Руслана (30.01.05 02:59)
Хм, ну печально конечно, однако мне как бы все равно....
Руслана (2005-01-30 02:59:00) [10]to olookin: я тот вариант уже стерла
i-s-v (2005-01-30 02:59:00) [11]
> а где смотреть что он пишет?
А он должен писать код последней ошибки...
> Handle2 := GetWindow(h,0);
А код обработчика в окне Tahion..
2 Руслана
Попробуй для начала послать не SendMessage(Handle, WM_UsER+$101, ... ), а
SendMessage(Handle, WM_CLOSE, ... )
olookin (2005-01-30 02:53:00) [12]А если
Handle2 := GetWindow(h,0);
то что происходит?
i-s-v (2005-01-30 02:50:00) [13]
> olookin
Сорри... 2 часа ночи... Не виже, шо пишу....:)
Руслана (2005-01-30 02:50:00) [14]а где смотреть что он пишет?
i-s-v (2005-01-30 02:49:00) [15]
> Если не 0 - значит, окно не находится
Наоборот, если не 0 - то все ОК.
Что пишет GetLastError?
olookin (2005-01-30 02:45:00) [16][40] i-s-v © (30.01.05 02:38)
>>Что возвращает
> SendMessage(Handle,WM_UsER+$101,0,0 )
? Если не 0 - значит, окно не находится
The return value specifies the result of the message processing and depends on the message sent.
Руслана (2005-01-30 02:43:00) [17]Возвращает 0
i-s-v (2005-01-30 02:38:00) [18]Что возвращает
> SendMessage(Handle,WM_UsER+$101,0,0 )
? Если не 0 - значит, окно не находится
Руслана (2005-01-30 02:36:00) [19]да, тут работает, находит окно, возвращает хендл(если это вторая копия). Кстати если приложение не в трее - то все равно не доходит
iskatel (2005-01-30 02:33:00) [20]а до
Handle := FindWindow(nil, 'TahionN');
SendMessage(Handle,WM_UsER+$101,0,0 )
доходит?