![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WM_COPYDATA и скрытое окно
DinoRay © (2005-05-20 17:23:00)Почему скрытое окно не получает сообщение WM_COPYDATA,
когда
ShowWindow(Application.Handle, SW_RESTORE) получает
так
ShowWindow(Application.Handle, SW_HIDE) не получает
?
GrayFace (2005-05-26 20:34:00) [1]DinoRay (26.05.05 18:55) [7]
Тут не в дельфе дело. Любое приложение с формой 'MainForm' может начать принимать твои сообщения. Лучше сделать так:
protected
procedure CreateParams(var Params: TCreateParams); override;
implementation
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WinClassName:='Уникальное имя класса';
end;
и, соответственно,tt:=FindWindow('Уникальное имя класса',nil)
DinoRay (2005-05-26 18:55:00) [2]Ха разобрался...
короче такая хрень происходит если в делфю загружен проект который принимает месаги,
если его выгрузить все нормально ловит...
делфя 6 XP Professional
вот так-то...
alpet (2005-05-26 18:47:00) [3]Сравни какое окно находится строкой "tt:=FindWindow(nil,'MainForm')", при свернутой и не свернутой форме второго приложения.
DinoRay (2005-05-26 18:30:00) [4]Да фиг там...
переписал в новый проэкт.. не получает
когда visible тогда получает если Hide не получает..
че за ерунда такая?
-----------------------Прога которая принимает
unit U_test;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, RXShell;
type
TForm1 = class(TForm)
RxTrayIcon1: TRxTrayIcon;
procedure FormCreate(Sender: TObject);
procedure RxTrayIcon1DblClick(Sender: TObject);
private
public
procedure WMCOPYDATA(var Message: TMessage); message WM_COPYDATA;
procedure ApplicationMinimize(Sender : TObject);
procedure ApplicationRestore(Sender : TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ApplicationMinimize(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.ApplicationRestore(Sender : TObject);
begin
ShowWindow(Handle, SW_RESTORE);
end;
procedure TForm1.WMCOPYDATA(var Message: TMessage);
var
pcd: PCopyDataStruct;
begin
pcd := PCopyDataStruct(Message.LParam);
ShowMessage(PChar(pcd.lpData));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := ApplicationMinimize;
Application.OnRestore := ApplicationRestore;
ApplicationMinimize(Self);
end;
procedure TForm1.RxTrayIcon1DblClick(Sender: TObject);
begin
Application.Restore;
Application.BringToFront;
end;
end.
-----------------------
------------------------ Прога которая отправляет
unit Unit14444;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
hwnd:THandle;
cd:TCopyDataStruct;
msgtext:String;
begin
hwnd := FindWindow (nil, 'FormTest');
msgtext:='asd';
if hwnd <> 0 then
begin
cd.cbData := Length(msgtext) + 1;
cd.lpData := PChar(msgtext);
SendMessage(hwnd, WM_COPYDATA, 0, LParam(@cd));
end;
end;
end.
френк (2005-05-20 21:24:00) [5]однозначно получает. у меня все работает. глюк явно у тебя где-то.
alpet (2005-05-20 20:20:00) [6]А что Spy++ (winsight32) дает по отношению к скрытому окну ?
DinoRay (2005-05-20 17:58:00) [7]2 приложения
первое классическое Tray
Определены
procedure ApplicationMinimize(Sender : TObject);
procedure ApplicationRestore(Sender : TObject);
procedure WMCOPYDATA(var Message: TMessage); message WM_COPYDATA;
procedure Tfrm_Main.ApplicationMinimize(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure Tfrm_Main.ApplicationRestore(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_RESTORE);
end;
procedure Tfrm_Main.WMCOPYDATA(var Message: TMessage);
var
pcd: PCopyDataStruct;
begin
pcd := PCopyDataStruct(Message.LParam);
end;
в OnCreate главной формы
Application.OnMinimize := ApplicationMinimize;
Application.OnRestore := ApplicationRestore;
ShowWindow(Application.Handle, SW_HIDE);
во втором приложении
procedure TForm1.Button1Click(Sender: TObject);
var
tt:THandle;
cd:TCopyDataStruct;
begin
tt:=FindWindow(nil,'MainForm');
ShowMessage(IntToStr(tt));
cd.cbData := Length('asas') + 1;
cd.lpData := PChar('asas');
SendMessage(tt, WM_COPYDATA, 0, Longint(@cd));
end;
при запуске первого окно Minimized, соответственно скрыто,
посылаем из второго месагу Handle находит, месага не приходит,
делаем в первом Restore все приходит
Игорь Шевченко (2005-05-20 17:44:00) [8]Получает. У тебя ошибка в программе