![]() |
| ||
|
|
Новости |
Поиск |
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 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]ну так почему ты не хочешь собственное сообщение приделать?