Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

Получает. У тебя ошибка в программе


Наверх

Титульная страница Поиск, карта сайта Написать письмо