组件中,怎样给应用程序的窗口发消息?(100分)

  • 主题发起人 主题发起人 pidi
  • 开始时间 开始时间
P

pidi

Unregistered / Unconfirmed
GUEST, unregistred user!
组件中,怎样给应用程序的窗口发消息?
用函数postmessage时的第一个句柄参数用什么表示?
ghand:HWND
ghand:Thandle,好象都不对,另外,在一般的应用程序中,声名句柄后,可以用
ghand:=self.create;创建。但在组件中怎么确定窗口的句柄了?
 

form1.handle?
self.handle?
application.handle?
 
这几个我都试过,不行
可以确认postmessage函数已执行,但是消息处理函数没有收到消息
 

const
WM_TEST = WM_USER + 1;

private
procedure TestMsg(var Msg: TMessage); message WM_TEST;

procedure TForm1.TestMsg(var Msg: TMessage);
begin
showmessage('ÊÕµ½');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(Handle,WM_TEST,0,0);
end;
 
看看PComm控件的源代码和示例,它的那个回调谐函数的概念也许对你有用。
 
TCustomForm(Owner).Handle
 
const
WM_TEST = WM_USER + 1;

private
procedure TestMsg(var Msg: TMessage); message WM_TEST;

procedure TForm1.TestMsg(var Msg: TMessage);
begin
showmessage('ok');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
HWnd:Thandle;
begin
HWmd:= FindWindow('TForm1',窗體的caption);
if HWnd<>0 then
PostMessage(HWnd,WM_TEST,0,0);
end;
 
to qianwt:TCustomForm(Owner).Handle编译都通不过
写成owner也一样。
我将他声明成ghand:HWND;或者application.handle编译都可以通过,就是消息不能捕获。

:leway
在组件设计时,不能确认一个具体的窗体。
 
to simon707 能给我发个吗?
goldcalf@163.com
 
[red]to pidi:
你包含Forms单元了吗;[/red]
 
包含了,调试错误显示
[Error] FPSXPD.pas(173): Undeclared identifier: 'Owner'
 
Owner是Component的属性,怎么可能会....
 
呵呵,你是要给窗体发消息是吧?用这个:GetAncestor(Handle, GA_ROOT)可以得到窗口的句柄
 
加一句,那个handle是组件的handle,这个API可以得到组件所在的最顶层的容器的句柄,就是窗体了
 
是要在组件中接收消息么? 如果这样用AllocateHWnd, DeallocateHWnd
参考TTimer源码..
 
我将代码贴出:下面都是组件中的代码
function getRegisterAction(pStatus:PFTSTATUS):integer;cdecl;
begin
case pStatus^.code of
FT_READY_TO_FILL_BUF:
PostMessage(g_hwnd, WM_URU_NOTIFY, MESSAGE_READY_TO_FILL_BUF,0);
FT_BUF_FILLED:
PostMessage(g_hwnd, WM_URU_NOTIFY,MESSAGE_IMAGE_RECEIVED, 0);
。。。。。
end;//g_hwnd我声明成HWND或者application.handle,消息函数还是收不到消息
此是回调函数,包含了消息传递过程postmessage,执行时也没出现异常,但是消息处理(接收)函数就是收不到消息。
const
WM_URU_NOTIFY=WM_USER+302;
MESSAGE_READY_TO_FILL_BUF=10;
MESSAGE_IMAGE_RECEIVED=11;
...
//消息处理函数
procedure TFPSensorXPD.WMURU(var Message: TMessage);
begin
case message.WParam of
MESSAGE_READY_TO_FILL_BUF:
showmessage('message ready to fill buf');
MESSAGE_IMAGE_RECEIVED:
showmessage('message image receivek');
....
end;
本来是很简单的代码,到了组件中就问题多多了,还望指点

 
是要在组件中接收消息
 
tseug非常感谢你,问题解决。
 

Similar threads

回复
0
查看
804
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
815
DelphiTeacher的专栏
D
S
回复
0
查看
896
SUNSTONE的Delphi笔记
S
后退
顶部