DLL发消息给主程序问题(200分)

  • 主题发起人 主题发起人 洪武
  • 开始时间 开始时间

洪武

Unregistered / Unconfirmed
GUEST, unregistred user!
我在DLL向主程序发消息时,自己定义的消息主程序不能收到,但系统的消息(WM_Close)主程序能够收到,不知道为什么?,请各位高手帮忙.<br>Const WM_MSG = WM_USER + 101;(DLL中的窗体和主程序中窗体都定义了且WM_MSG两边都相同)<br>PostMessage(Application.Handle, WM_MSG, 0, 0); &nbsp; <br>SendMessage(Application.Handle, WM_MSG, 0, 0);
 
试下:SendMessage(Application.MainForm.Handle, WM_MSG, 0, 0);
 
我试过了 不行啊, 是不是有些消息主窗体那边收不到啊.<br>我把消息注册了也还是不行
 
有没有将handle传进去?
 
程序调用DLL前,没有有把Application.Handle传进DLL里
 
WM_CLOSE 消息收到了就表明 Handle 没有问题了<br>写个简单的消息传递 Demo 参考一下<br>1.DLL 工程单元代码<br>library Project2;<br><br>uses<br>&nbsp; Windows, Messages;<br><br>const<br>&nbsp; MY_MSG = WM_USER + 101;<br><br>{$R *.res}<br><br>procedure LoadDLL(const AHandle: Pointer); stdcall;<br>begin<br>&nbsp; PostMessage(THandle(AHandle),MY_MSG,11,22);<br>end;<br><br>exports<br>&nbsp; LoadDLL;<br><br>begin<br><br>end.<br><br>2.主程序代码<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, StdCtrls;<br><br>const<br>&nbsp; MY_MSG = WM_USER + 101;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; procedure MyMsgFunc(var AMsg: TMessage); message MY_MSG;<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>procedure LoadDLL(const AHandle: Pointer); stdcall;external 'Project2.dll';<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; LoadDLL(Pointer(Handle));<br>end;<br><br>procedure TForm1.MyMsgFunc(var AMsg: TMessage);<br>begin<br>&nbsp; ShowMessage(IntToStr(AMsg.WParam) + '|' + IntToStr(AMsg.LParam));<br>end;<br><br>end.
 
你在dll中往你的程序发送消息, 你得知道它的句柄,你可以使用内存映射使在dll中获得你的程序的句柄,或者使用楼上的方法来传递参数到dll中.
 
sendMessage(目标句柄, 消息, 参数1, 参数2);<br>正如楼上说的。就像发邮件,首先要知道对方的地址一样。<br>可以用主程序发送句柄,也可以用Findwindow(nil,'接受消息的form的caption')得到句柄,再发送。
 
要用窗体的handle,而不是application的handle
 
发消息,你看你在哪处理你的消息,你用哪个窗体处理就要给哪个窗体发消息,也就是哪个窗体的 handle
 
在主程序里消息函数这样声明:<br>procedure XXXMsg(var Msg: TMessage); message 8888;<br><br>在DLL里直接这样发消息:PostMessage(Application.Handle, 8888, 0, 0);<br><br>注意:PostMessage(Application.Handle, 8888, 0, 0)参数 Application.Handle绝对不能写成窗口句柄,否则根本收不到消息。
 
怎么会收不到呢,我的程序为什么没有问题呢<br><br>完全可以收到呀
 
如果用postmessage ,且参数也能指向正确的Application.Handel <br>则到在主窗体放一TApplicationEvents 组件.OnMessage事件 来捕捉消息.<br>不必注册消息.
 
后退
顶部