Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Вопрос по вызову программы из трея.   Найти похожие ветки 

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

Тут уже мелькал подобный вопрос, но к сожалению, ответы на него мне не помогли.
Имеется приложение. С помощью компонента 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.


 
Andy BitOff ©   (2005-01-30 00:51) [1]

Теперь будем выпуздыривать...


 
Руслана   (2005-01-30 01:01) [2]

В смысле?


 
Andy BitOff ©   (2005-01-30 01:11) [3]

Ой, извините, я не подумал, что меня можно не так понять. Но мого Вас уверить, в моих словах небыло ничего не приличного. :)


 
Руслана   (2005-01-30 01:12) [4]

А по теме что нибудь написать?


 
iskatel ©   (2005-01-30 01:14) [5]

что то я не въехал - какое собственное? ты же посылаешь виндовское...

что показывает отладчик? хендлы находятся?


 
DrPass ©   (2005-01-30 01:17) [6]

Ты ему лучше вместо всего этого

> ShowWindow(Handle2,SW_Show);
>     ShowWindow(Handle2,SW_RESTORE);

пошли сообщение, которое выдает иконка в трее (если не знаешь какое, загляни в исходники этой компоненты)


 
Руслана   (2005-01-30 01:18) [7]

Я в тех исходниках ничего не поняла


 
Руслана   (2005-01-30 01:20) [8]

Хендлы находятся. Но из трее не вылазит. Если лежит на панели задач - тогда восстанавливается.


 
iskatel ©   (2005-01-30 01:22) [9]

очень содержательные у тя ответы, но мы только начинающие телепаты... скажи что нить конкретное, проверь в отладчике h и Handle2 у тебя не nil


 
iskatel ©   (2005-01-30 01:24) [10]

тогда проще и правда послать своей проге собственное сообщение, обработав которое она развернется...


 
kaZaNoVa ©   (2005-01-30 01:24) [11]

Руслана   (30.01.05 1:20) [8]
ты на Украине, позвонить можно?
//что-то мыло твоё очень номер телефона напоминает))
какой код?


 
Руслана   (2005-01-30 01:26) [12]

Код который написан вверху был опробован с разными иконками в трее. И не одну он оттуда не поднял. Вряд ли он правильный.
Я прошу написать пример как все это сделать правильно...


 
olookin ©   (2005-01-30 01:31) [13]

[9] iskatel ©   (30.01.05 01:22)

h по-моему надо на 0 проверять, а не на nil


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

Это мобильник который давно украли, а мыло осталось :(


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

To olookin: Ща попробую
Неужели никто не сталкивался с такой проблемой и не решил ее?
Не верю.


 
iskatel ©   (2005-01-30 01:34) [16]

2olookin а что такое nil?


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

To olookin:Не помогает


 
iskatel ©   (2005-01-30 01:39) [18]

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


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

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


 
i-s-v ©   (2005-01-30 01:46) [20]


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

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

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


 
i-s-v ©   (2005-01-30 01:48) [21]

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


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

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


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

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

Не помогает


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

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


 
i-s-v ©   (2005-01-30 01:58) [25]


> Не помогает

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


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


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

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


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

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


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

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


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

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


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

Обработка такая?
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:10) [31]

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;


 
iskatel ©   (2005-01-30 02:11) [32]

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


 
i-s-v ©   (2005-01-30 02:14) [33]


> if Msg = WM_UsER+$101 then

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


 
i-s-v ©   (2005-01-30 02:15) [34]

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


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

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


 
iskatel ©   (2005-01-30 02:19) [36]

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


 
Руслана   (2005-01-30 02:27) [37]

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:33) [38]

а до  
Handle := FindWindow(nil, "TahionN");
SendMessage(Handle,WM_UsER+$101,0,0 )

доходит?


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

да, тут работает, находит окно, возвращает хендл(если это вторая копия). Кстати если приложение не в трее - то все равно не доходит


 
i-s-v ©   (2005-01-30 02:38) [40]

Что возвращает
> SendMessage(Handle,WM_UsER+$101,0,0 )
? Если не 0 - значит, окно не находится



Страницы: 1 2 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.054 c
1-1106552754
kingdom
2005-01-24 10:45
2005.02.13
Построение контура кривой Безье


14-1106436167
Franzy
2005-01-23 02:22
2005.02.13
Странный глюк Win98SE


3-1105968439
Игорь Писанко
2005-01-17 16:27
2005.02.13
Индекс текстового поля как числового


1-1106742980
Mishenka
2005-01-26 15:36
2005.02.13
Чем отличается Integer от LongInt?


3-1105440919
DimaK
2005-01-11 13:55
2005.02.13
профили пользователей WinXP и BDE