Форум: "Основная";
Текущий архив: 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