Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по вызову программы из трея. [D7, WinXP]


Страницы:   1 2 3

Руслана ©   (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 )

доходит?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо