200分:求消息处理全过程(200分)

  • 主题发起人 主题发起人 ykjt
  • 开始时间 开始时间
Y

ykjt

Unregistered / Unconfirmed
GUEST, unregistred user!
想知道:WINDOWS如何发送消息到delphi应用程序的?DELPHI内部是如何处理消息的?WINDOWS是如何回调窗口函数的?
在网上找了一些文章,都讲的片面或没有系统化。希望看到这样文章:看完后对DELPHI的消息处理有比较系统的理解,以至自己能编写处理消息的程序。
 
记得InsideVCL里讲得挺详细的
 
InsideVCL
电子版的没找到
 
www.2ccc.com
 
下了 InsideVCL
 
哪位高手能用精练的语言讲一讲,话不用多,关键之处点透就行。
 
下了就摆着,别看[:)]
 
一定要看,找了很常时间,如获至宝!
 
{*******************************************************}
{ }
{ 最小D程序 }
{ }
{ Copyright (c) 2001-2006 ismmsoft }
{ http://www.ismmsoft.net }
{ }
{*******************************************************}

program MiniD;

uses
Windows,
Messages;

{$R *.res}

function WndProc(hWnd, uMsg, wParam, lParam: Longint): Longint; stdcall;
begin
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
if uMsg = WM_DESTROY then PostQuitMessage(0);
end;

const
APPNAME = '最小D程序';

var
WndClass: TWndClass;
Msg: TMsg;
Handle: HWND;
begin
with WndClass do
begin
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @WndProc;
hInstance := hInstance;
hbrBackground := COLOR_WINDOW + 1;
lpszClassname := APPNAME;
hCursor := LoadCursor(0, IDC_ARROW);
end;
RegisterClass(WndClass);

Handle := CreateWindow(APPNAME, APPNAME,
WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, 0, 0, hInstance, nil);
UpdateWindow(Handle);
ShowWindow(Handle, SW_NORMAL);

while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
 
窗口函数为何要windows调用而不是delphi自己执行?
 
窗口函数为何要windows调用而不是delphi自己执行?
------------------------------------------------
windows窗口程序是消息驱动的,这决定了窗口函数必然是一个回调函数.
 
想看全过程好办。
在button1.onclick事件中设个断点,Project option里Compiler页把
use debug ducs选中,然后调试到断点,看call stack就行了.
 
to e-:
你是直接在工程文件中写的程序么
不用application么
 
有本书好像叫《Windows高级编程》,网上有中文的电子版,这本书很有名,开篇讲的就是Windows消息,虽然不是Delphi版本的,但理论是相通的。
 
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);//调度消息到窗口过程
end;
end
else
FTerminate := True;
end;
end;
在什么时机WINDOWS调用窗口过程?从DELPHI源码中能看出吗?
 
DispatchMessage(Msg);就会调用窗口的窗口过程,相关的代码是在系统
User32.dll里,Delphi里是没有的。
 
DispatchMessage(Msg)
都干了些什么?
 
其实InsideVCL里面开头几章讲得非常的清楚,看这几章绝对不会超过二天的时间!
 
越看越糊涂:
DispatchMessage(Msg)
多种解释:
1。请求windows重发消息。。。
2。把消息发给窗口函数。。。。
3。DispatchMessage将处理后的消息发回Windows,由Windows自己处理,它所完成的工作就是把当前消息分发到相关的窗口过程。然后窗口过程根据消息的类型对不同的消息进行相关处理....
 
简单的说:DispatchMessage就是系统user32.dll模块导出的一个api函数,
这个函数接受msg参数,根据msg的句柄找到对应的窗口函数,然后调用
该窗口函数,参数还是msg
 
后退
顶部