{ Custom WindowProc function }
function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
{ Checks for messages }
if (lParam = Button1) and (uMsg = WM_COMMAND) then
CheckPassword;
if uMsg = WM_DESTROY then
Halt;
end;begin
{ ** Register Custom WndClass ** }
Inst := hInstance;
with WinClass do
begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := @WindowProc;
hInstance := Inst;
hbrBackground := color_btnface + 1;
lpszClassname := 'AG_TESTWINDOW';
hCursor := LoadCursor(0, IDC_ARROW);
end; { with }
RegisterClass(WinClass); { ** Create Main Window ** }
Handle := CreateWindowEx(WS_EX_WINDOWEDGE, 'AG_TESTWINDOW', 'Amigreen TestWindow 1.00',WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,363, 278, 305, 65, 0, 0, Inst, nil); { ** Create a button ** }
Button1 := CreateWindow('Button', 'OK', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT,216, 8, 75, 25, handle, 0, Inst, nil); { ** Create a label (static) ** }
Label1 := Createwindow('Static', '', WS_VISIBLE or WS_CHILD or SS_LEFT,
8, 12, 76, 13, Handle, 0, Inst, nil); { ** Create an edit field ** }
Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or WS_VISIBLE or WS_BORDER or ES_PASSWORD, 88, 8, 121, 21, Handle, 0, Inst, nil);
...... { ** Message Loop ** }
while(GetMessage(Msg,Handle, 0, 0)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end; { with }
end.请问我下面的理解对否?
1、通过WinClass创建一个句柄为handle的主窗口,属于进程Inst。
2、button、label和edit也都是窗口,为什么不需要向系统注册?不注册,怎么找到它们的窗口处理函数,怎么去处理它们的消息?
3、假设有无数个应用程序(进程),触发了无数个消息,系统是用一个消息队列来管理,还是给每一个应用程序(进程)都管理一个消息队列。也就是getmessage读的消息队列里有没有其他应用程序(进程)的消息?
4、GetMessage(Msg,Handle, 0, 0)是读取与handle主窗口有关的消息,而GetMessage(Msg,0, 0, 0)是读取本进程中所有的消息?
5、DispatchMessage(msg)是将消息派发到窗口,也就是调用msg.handle句柄窗口的窗口函数来处理该消息。主窗口可以通过lpfnWndProc使系统找到WindowProc来处理主窗口消息。但button、label和edit的消息了。难道都通过windowproc来处理?
6、sendmessage函数也就相当DispatchMessage(msg)这一步了。
解决方案 »
- MSsql中能否拦截sql 语句,比如拦截查询,拦截插入
- delphi 6 的一个应用程序的图标不能修改
- 如何在DELPHI中调用ASP程序,并且获得返回值?详情见问题内容。。。
- 定时器问题
- 大家来帮我看一看
- 大家帮一下忙,这到底是怎么回事?
- 用TWEBROWER如何判断所连接的页面存在并且打开完毕啊。
- 请教object treeview操作
- sql link在那里
- 我想体会一下activex/com的概念,有什么好办法?
- 准备换工作,想请问一下南京的delphi程序员目前薪水大约是多少? 也好提供一个参考. 谢谢!
- 关于XP式的气泡提示,不规则窗口的形成,透明背景ICON图标的制作软件。谢谢。
3.每一个应用程序都有消息队列。
6.SendMessage也就是直接把消息发送到指定的窗口过程,等消息处理完毕才返回。这也只是我的理解,不一定准确。还是看看李维的《Inside VCL》吧,里面对VCL消息机制讲的很清楚。Windows消息处理过程请参考《Windows程序设计》。
还有一个广播功能, 可以向当前所有窗口发消息
只有注册过该消息号的窗口才能接受
楼主可以看看所有消息的help
Windows->Delphi Application->TWinControl
MainWndProc->WndProc->Dispatch->Handler
首先,Windows是一个基于消息的系统,应用程序运行时,程序中每个有窗口句柄的控件都会在Windows中注册一个窗口过程,这个过程就是上面的MainWndProc。消息到达MainWndProc后,由MainWndProc使用VCL的消息派遣机制来处理这个消息。
那么,消息是如何到达MainWndProc中的呢?每个Delphi Application运行后(Application.Run)调用ProcessMessages方法,由这个方法实现一个消息循环。在这个方法内部调用了另一个TApplication的方法ProcessMessage,它从Windows中提取属于本Application的消息,如果提取的消息是WM_QUIT,则中止程序。每当提取一个消息,就会触发OnMessage事件并调用方法DispatchMessage。在OnMessage事件中如果用户已经编写了处理消息的代码,则运行这些代码,消息到此结束。如果在OnMessage中没有处理,则调用DispatchMessage。
function DispatchMessage(const lpMsg: TMsg): Longint; stdcall
在lpMsg中有消息正文和消息需要发往的窗口句柄,该方法将消息发送到控件的MainWndProc,从此,消息进入了VCL自己的消息处理机制,从而在TWinControl内部实现消息处理。在MainWndProc中实际上是调用了WindowProc方法。WindowProc又等价于WndProc,所以实际上是调用了WndProc。WndProc让控件能对一些特殊的消息进行必要响应,比如focus,mouse,keyboard等。WndProc将消息传入Dispatch,Dispatch实现消息派遣,它首先在本类中查找与消息对应的消息方法,如果没有,则在父类、祖父类中找,直到TObject,如果TObject中也没有,那么调用DefaultHandler,DefaultHandler保证所有消息都能被处理。到此,整个消息机制结束。
5.button、label和edit有自己的默认窗口过程处理函数。此例子中,使他们的父窗口先截取了传给他们的消息。
6.sendmessage是向窗体发送消息,窗体通过getmessage接受消息,但是getmessage此时并没有把消息传递给窗体过程,传递任务是通过DispatchMessage进行的。