讨论:perform(),sendmessage(),postmessage()区别

killme2008 2003-09-15 09:44:36

windows消息系统是由三部分组成
消息队列
消息循环
窗口过程

一个消息从发生到处理的过程如下:
事件发生->消息队列->消息循环->事件处理

消息传递由Tobject.DIspach()重载实现,消息发送其中sendmessage()发送到应用程序后有返回,而postmessage()无返回.
另外,对于广播消息,有Broadcast()函数,也可以用如下形式:
Sendmessage(HWND_BROADCAST,TMessage,0,0);实现
最近学的,不知道理解的对不对,请指点
能不能给个这些函数使用的例子???

还有,以WM开头的是窗口消息,那么以EM开头的是什么消息??还有其他种类吗?
...全文
210 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
killme6115 2003-09-27
  • 打赏
  • 举报
回复
up
year2000bug 2003-09-20
  • 打赏
  • 举报
回复
找M$的msdn
现在很多书都是在msdn上copy些例子,然后骗我们钱。
ly_liuyang 2003-09-19
  • 打赏
  • 举报
回复
最好看MSDN和VCL机制
mingjunlee 2003-09-19
  • 打赏
  • 举报
回复
function TControl.perform(Msg: Cardinal;WParam,LParam:LongInt);: LongInt;是Delphi自己的发送消息的方式

function SendMessage(hWnd: HWND;Msg: UINT;wParam: WPARAM;lParam :LPARAM):LRESULT; stdcall; 和
function PostMessage(hWnd: HWND;Msg: UINT;wParam: WPARAM;lParam :LPARAM):Bool;
stdcall; 是API函数

killme2008 2003-09-19
  • 打赏
  • 举报
回复
谢谢
初学delphi ,没有人指点,幸好还有CSDN
能不能帮我介绍关于这方面的比较好的书???
killme2008 2003-09-19
  • 打赏
  • 举报
回复
楼上的意思是不是说
sendmessage()是通过控制句柄来实现
postmessage()还要通过消息泵转化

perform()就可以直接传递??
lxpbuaa 2003-09-19
  • 打赏
  • 举报
回复
1、SendMessage,由系统将消息派遣给窗口对应的窗口过程,不进入消息队列,并等待消息处理完毕后再返回。
2、PostMessage,将消息放入窗口所属引用程序的消息队列,立即返回。
3、Perform是VCL自己定义的,直接调用VCL控件的窗口过程,等待消息处理完毕后返回。

WM表示Windows Message,即Windows标准消息。EM、LB、CB等是Windows的一些分类消息,分别对应于Eidt/Memo/RichEdit、ListBox、ComBox等Windows标准控件。
另外,VCL内部也根据一些需要定义了消息。

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
year2000bug 2003-09-19
  • 打赏
  • 举报
回复
楼主,你悟解我了。
SendMessage():发送一个消息,系统直接调用窗口进程。通信是即时的,直到窗口进程为调用函数返回一个结果,应用程序才能继续。

PostMessage():寄送一个消息时,系统发送到拥有该窗口的应用程序消息队列中。消息队列是系统定义的一个内存快,用于临时存贮消息,或是把消息直接发送窗口过程。每个窗口维护自己的消息队列,并从中取出消息,利用窗口函数进行处理。调用函数发送消息后就立即返回,但结果只是表示消息寄送成功与否,而不表示调用窗口进程的结果。


这个perform嘛。
看看delphi的定义。
WindowProc(Message);
他把一个指定的消息交给窗口(控件窗口)处理函数。

function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
var
Message: TMessage;
begin
Message.Msg := Msg;
Message.WParam := WParam;
Message.LParam := LParam;
Message.Result := 0;
if Self <> nil then WindowProc(Message);
Result := Message.Result;
end;
year2000bug 2003-09-19
  • 打赏
  • 举报
回复
窗体对象
|
|
SendMessage()-------------------------------------->>WinProc地址
^
|
|
消息泵
^
|
|
|
PostMessage()-----------消息n+1
消息n+2
消息n+3



[消息]
perform: 控件1------------->控件2
year2000bug 2003-09-19
  • 打赏
  • 举报
回复
窗体对象
|
|
SendMessage()-------------------------------------->>WinProc地址
^
|
|
消息泵
^
|
|
|
PostMessage()-----------消息n+1
消息n+2
消息n+3



[消息]
perform: 控件1------------->控件2
QSmile 2003-09-18
  • 打赏
  • 举报
回复
Perform 相当于用 CallDefineWindowProc
killme2008 2003-09-18
  • 打赏
  • 举报
回复
各位高手能不能给个例子??
Tiack 2003-09-18
  • 打赏
  • 举报
回复
好像不行也
killme2008 2003-09-16
  • 打赏
  • 举报
回复
大家能不能给我个例子
对于VCL内部如何对消息进行封装我还不大懂
OO_is_just_P 2003-09-15
  • 打赏
  • 举报
回复
perform 在VCL内部处理。
hkbarton 2003-09-15
  • 打赏
  • 举报
回复
sendmessage()//相当于执行过程,立即执行,立即返回结果
postmessage//将消息发送到消息队列,直到其前面的消息处理完毕后再执行
killme2008 2003-09-15
  • 打赏
  • 举报
回复
自己顶一下

刚学这个
能不能有高手给我个例子>????

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧