dll中不能响应自定义消息
建立一个dll,里面有个TForm, 自定义消息,并且建立响应函数。但是sendmessage调用没有用,而在我简历一个应用程序,最简单的,如下代码,确实ok的,能够弹出提示框。why?
const
WM_CHANGESIZE= WM_USER+1000;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure OnChangeSize(var msg: TMessage); message WM_CHANGESIZE;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
sendmessage(self.Handle,WM_CHANGESIZE,0,0);
end;
procedure TForm1.OnChangeSize(var msg: TMessage) ;
begin
showmessage('TFormExplorer.OnChangeSize');
end;
end.
[解决办法]
摘自CSDN某高人:
Borland的天才们无心插柳的设计再一次让我们找到了解决问题的办法。由前面的分析我们知道,在用VCL开发的动态链接库中并没有创建隐藏的窗口来接收Windows消息(CreateHandle不执行),但在动态链接库中如果要显示窗口的话又需要一个父窗口。如何解决这个问题呢?VCL的设计者将保存看不见的窗口句柄的FHandle变量设计为可写,于是我们实际上可以简单地给FHandle赋一个值来为需要显示的子窗口提供一个父窗口。例如,在某个动态链接库插件中要显示窗体,我们通常会在主模块可执行文件中将Application对象的句柄通过动态链接库的某个函数传入并赋值给动态链接库的Application.Handle,类似于:
procedure SetApplicationHandle(MainAppWnd: HWND)
begin
Application.Handle := MainAppWnd;
end;
[解决办法]
WM_CHANGESIZE := RegisterWindowMessage('This is a Message From Budded');
用这个来发送介绍,保准没问题,呵呵
[解决办法]
WM_CHANGESIZE := RegisterWindowMessage('This is a Message From Budded');
用这个发送接收消息肯定没问题!