***自定義消息為何無效果***(20分)

  • 主题发起人 主题发起人 rrr
  • 开始时间 开始时间
R

rrr

Unregistered / Unconfirmed
GUEST, unregistred user!
代碼如下:
unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
; StdCtrls;

const WM_abc = WM_user + 234;

type
; TForm1 = class(TForm)
; ; Button1: TButton;
; ; Memo1: TMemo;
; ; procedure Button1Click(Sender: TObject);
; ; procedure FormCreate(Sender: TObject);
; private
; ; { Private declarations }
; ; procedure MyProcessMsg( var Msg: TMsg; var Handled: boolean );
; public
; ; { Public declarations }
; end;

var
; Form1: TForm1;

implementation

{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);
begin
; ; sendMessage( form1.handle , wm_abc , 0 , 0 );
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
; ; Application.OnMessage := MyProcessMsg;
end;

procedure TForm1.MyProcessMsg(var Msg: TMsg; var Handled: boolean);
begin
; ; if Msg.message = wm_abc then
; ; ; ;Memo1.Lines.Add( ' You name is abc ');
end;

end.
 
//要这样定义
;procedure MyProcessMsg( var Msg: TMsg; var Handled: boolean ); message ;
 
这么写,多简单,还不用 Application.OnMessage := MyProcessMsg;

;private
; ; { Private declarations }
; ; procedure MyProcessMsg( var Msg: TMsg);message wm_abc;
;

procedure TForm1.MyProcessMsg(var Msg: TMsg);
begin
; ;Memo1.Lines.Add( ' You name is abc ');
end;
 
tinytao:
; ; 這是Application.OnMessage ,不是直接映射Message,請問有何辦法???
 
Brave:
; ; 我想找出原因,請指教
 
这是Delphi的帮助,我怀疑他只处理其他应用程序发送过来的消息,也就是Windows发送过来的消息,
不处理内部的消息。
Note: OnMessage only receives messages that are posted to the message queue,
;not those sent directly with the Windows API SendMessage function.
 
to Brave:
那段英文的意思应该是:OnMessage只接收由消息队列中发过来的消息,而不会
接收由API函数SendMessage直接发送过来的消息。
这是我在我的程序中自定义的消息。这样做的时候并不需要在Application.OnMessage中
做处理,而且程序可以给自己发送消息,我用的是PostMessage,我想用SendMessage也
应该可以。
; protected
; ; procedure SXCREATE(var Msg:TMessage);message SX_CREATE;
 
是呀,教父,我也是这个意思,我建议处理内部的消息用
这么写,多简单,还不用 Application.OnMessage := MyProcessMsg;

;private
; ; { Private declarations }
; ; procedure MyProcessMsg( var Msg: TMsg);message wm_abc;
;

procedure TForm1.MyProcessMsg(var Msg: TMsg);
begin
; ;Memo1.Lines.Add( ' You name is abc ');
end;

处理外部windows消息队列的消息采用onmessage亚
 
要么用postmessage代换sendmessage.
要么改写一下—
procedure TForm1.MyProcessMsg(var Msg: TMsg; var Handled: boolean);
begin
; ; if Msg.message = wm_abc then
; ; begin
; ; ; ;Memo1.Lines.Add( ' You name is abc ');
; ; ; ;handled:=true;
; ; end;
end;
要知道sendmessage是要等待返回结果的,所以必须对handled赋值表明是否处理了该消息。
 
看我该帖使用onmessage的例子

http://www.delphibbs.com/delphibbs/dispq.asp?LID=676033
 
感谢以上各位的支持,问题的原因已找到,我由衷的感谢大家。
感谢教父,提供一段译文和注释,使我明白许多;
感谢Brave热心的支持;
感谢doxpic的提醒。
我想进来看答案的人,也会有我这样的感觉,我仅代表所有想知道
原因的学子,感谢以上几位。
 
多人接受答案了。
 
to 教父&Brave:
; ;这么说来那一段note根本是不对的。
; ;我的确在application.onmessage事件(已映射到MyProcessMsg过程)中
截获了sendmessage所发的自定义消息.关键是要对handled赋值。
 
to doxpix:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
; var Handled: Boolean);
begin
if Msg.message=WM_KEYDOWN ;then Showmessage('Get Message');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(Application.Handle,WM_KEYDOWN,0,0);
end;
你说我这段代码有没有问题?我点击Button1,程序确实不会Showmessage啊,说明它
没有捕捉到WM_KEYDOWN这个消息。
 
老大,我不是说了吗?
你没有对handled赋值吧。ApplicationEvents1Message改成这样:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
; var Handled: Boolean);
begin
; if Msg.message=WM_KEYDOWN ;then
; begin
; ; Showmessage('Get Message');
; ; handled:=true;
; end;
end;

要不改也行,那就这样:
procedure TForm1.Button1Click(Sender: TObject);
begin
; PostMessage(Application.Handle,WM_KEYDOWN,0,0);
end;

为什么不能响应自定义的消息呢?是因为sendmessage()在等待你的消息
处理程序给它一个返回值呀,而postmessage就不必等了。
 
用sendmessage果然不行。无论是否对handled赋值。
可能是我昨天做那个demo时看花了眼。
 
呵呵,我都想叫你老大了 [:)]

PostMessage和SendMessage的区别在于SendMessage是发给某一个窗口程序,并且等待消息
被处理,而PostMessage则是把消息发送到消息队列后就直接返回。
而OnMessage正好是处理消息队列中的消息,所以就可以处理PostMessage过来的消息了。
[:)]
 
教父严谨的学术态度,本人不胜钦佩。大家本着把问题弄个究竟,绝无私心,
这种学术气氛一定要好好发扬光大,让所有的人得益。我想,更重要的是我们
都有所提高。
另本人也对答案没作一一的验证,出现上面的问题,我应该负上全部的责任。
现向所有路过的或直接参与的程序员们表示道歉。
 
to 教父:
; ;[:)]
; ;我确实不是想灌你的(再说也没那资格吧)。只是我前天在做个测试程序时
忙中出错,让我觉得{sendmessage&handled}也是可行的。可惜我没能保存那
个测试程序的源码,只有exe。无法验证了:-(
 
后退
顶部