Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
Руслана   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.033 c
1-1107158201
ТехникПТО
2005-01-31 10:56
2005.02.13
Real в String


9-1100094615
NightFire
2004-11-10 16:50
2005.02.13
Ну хоть на этот раз кто-нибудь ответит


1-1107107304
Sh
2005-01-30 20:48
2005.02.13
Rect ячейки stringgrid a


4-1103641722
juice
2004-12-21 18:08
2005.02.13
MS Word, OLEContainer


1-1106819778
Viktop
2005-01-27 12:56
2005.02.13
Коды клавиш





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский