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 02:27:00) [21]

program TahionN;

uses
 Forms,
 Windows,
 Messages,
 Dialogs,
 Main in 'Main.pas' {MainForm},
 MyDM1 in 'MyDM1.pas' {DataModule1: TDataModule},
 Info in 'Info.pas' {FormInfo},
 Options in 'Options.pas' {FormOption},
 USB_option in 'USB_option.pas',
 Erase in '..\Erase.pas' {FormErase},
 PassDtmf in 'PassDtmf.pas' {FormDTMFPass},
 Programm in 'Programm.pas' {FormProgramm};

{$R *.res}
const
MUTEX_NAME = '{F7537844-9C6F-45B5-97CB-3F2D7329289C}';
var
MutexHandle: THandle;
Handle: HWND;

function IsAlreadyExists: boolean;
begin
MutexHandle := OpenMutex(MUTEX_ALL_ACCESS, false, MUTEX_NAME);
if (MutexHandle = 0) then
begin
  MutexHandle := CreateMutex(nil, false, MUTEX_NAME);
  Result := false;
end else
  Result := true;
ReleaseMutex(MutexHandle);
end;

begin
if IsAlreadyExists then
begin
  Handle := FindWindow(nil, 'TahionN');
  SendMessage(Handle,WM_UsER+$101,0,0 )
end else
begin

// RegisterWindowMessage(WM_USER+1);
 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;
end.

в окне  Tahionn
Const MY_MSG = WM_USER+$101;
type
 TMainForm = class(TForm)
private
   { Private declarations }    
   procedure StandUpTahion(var msg: TMessage); message MY_MSG;

implementation ...

procedure TMainForm.StandUpTahion(var msg: TMessage);
begin
   CoolTrayIcon.ShowMainForm;          
   CoolTrayIcon.IconVisible:=false;    
   PopupMenuTray.AutoPopup:=false;    
end;

Брейкпойнт ставлю на CoolTrayIcon.ShowMainForm;    - не доходит


iskatel   (2005-01-30 02:19:00) [22]

ну так покажи что написала


Руслана   (2005-01-30 02:17:00) [23]

Чего то не работает. Вроде как сообщение не доходит (или не отсылается)


i-s-v   (2005-01-30 02:15:00) [24]

iskatel прав.
Процедуры назови одинаково. И лучше не Show


i-s-v   (2005-01-30 02:14:00) [25]


> if Msg = WM_UsER+$101 then

Можно выкинуть.


iskatel   (2005-01-30 02:11:00) [26]

что то ты напортачила - я конечно не знаю точно как обработчике в дельфи объявляются, но судя по всему объявляешь ты обработчиком Show(var Message) а надеешься что вызовется StandUpTahion


i-s-v   (2005-01-30 02:10:00) [27]

unit {какойто-там - для окна 'Tahionn'}
...
Const MY_MSG = WM_USER+$101;
type
 TForm1 = Class
...
private
 Procedure MyMsg (var msg: TMessage); message MY_MSG;
....
procedure TForm1.MyMsg (var msg: TMessage);
begin
 Show;
end;


Руслана   (2005-01-30 02:07:00) [28]

Обработка такая?
private
   { Private declarations }  
   procedure Show(var Message);
   message   WM_USER+$101;

procedure TMainForm.StandUpTahion(var Message);
begin
with TMessage(Message) do
 begin
   if Msg = WM_UsER+$101 then
   begin  
   CoolTrayIcon.ShowMainForm;          
   CoolTrayIcon.IconVisible:=false;  
   end;
 end;
end;

и снова не работает


i-s-v   (2005-01-30 02:06:00) [29]

А ты обработчик на событие WM_UsER+$101 поставила? WM_UsER+$101 - это так, для примера.


iskatel   (2005-01-30 02:05:00) [30]

конечно, ведь его еще и обрабатывать нужно в запущ. проге
пусть тебе i-s-v напишет, я могу только под билдер, тебе придется
самой под дельфю переделывать


Руслана   (2005-01-30 02:03:00) [31]

SendMessage(Handle, WM_UsER+$101, ... ) здесь я так понимаю
SendMessage(Handle, WM_UsER+$101,0,0) ?
Не помогает


i-s-v   (2005-01-30 02:00:00) [32]


> Ругается на MutexHandle, говорит Undeclared identifer

Допиши в var'e
 MutexHandle: THandle;


i-s-v   (2005-01-30 01:58:00) [33]


> Не помогает

Раз окно находится, то ему должны приходить сообщения. Попробуй послать окну "свое" сообщение, а в его обработчике напиши то, что должно происходить с окном


Руслана   (2005-01-30 01:57:00) [34]

>i-s-v
Ругается на MutexHandle, говорит Undeclared identifer


Руслана   (2005-01-30 01:53:00) [35]

>З.Ы. А что такое
>Handle2 := GetWindow(h,GW_OWNER);?
>И почему не слать сообщения на окно h?

Не помогает


Руслана   (2005-01-30 01:49:00) [36]

Спасибо! А как принять это сообщение в запущенной копии?


i-s-v   (2005-01-30 01:48:00) [37]

З.Ы. А что такое
Handle2 := GetWindow(h,GW_OWNER);?
И почему не слать сообщения на окно h?


i-s-v   (2005-01-30 01:46:00) [38]


> Мне кажется, что лучше всего использовать собственные сообщения.

Лучше всего использовать мьютексы. Вот код:

program...
...

Uses Windows...
..
const
 MUTEX_NAME = '{F7537844-9C6F-45B5-97CB-3F2D7329289C}'
var

Handle: HWND;

function IsAlreadyExists: boolean;
begin
 MutexHandle := OpenMutex(MUTEX_ALL_ACCESS, false, MUTEX_NAME);
 if (MutexHandle = 0) then
 begin
   MutexHandle := CreateMutex(nil, false, MUTEX_NAME);
   Result := false;
 end else
   Result := true;
 ReleaseMutex(MutexHandle);
end;

begin
 if IsAlreadyExists then
 begin
   Handle := FindWindow(nil, MyWindow');
   SendMessage(Handle, WM_UsER+$101, ... )
 end else
 begin
   Application.Initialize;
.....
 end;
end.

По-моему, так лучше...

---
The Death Will Come


Руслана   (2005-01-30 01:40:00) [39]

iskatel: h= 4719858 Handle2 = 0
Приделать хочу, но не знаю как. Расскажи


iskatel   (2005-01-30 01:39:00) [40]

ну так почему ты не хочешь собственное сообщение приделать?


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

Наверх

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