Delphi Windows 消息 1

1.什么是消息
在Windows单元中,消息是这样声明的:
type
TMsg=packed record
    hwnd:HWND;//窗口句柄
    message:UNIT;//消息常量标识符
    wParam:WPARAM;//32位消息的特定附加消息
    lParam:LPARAM;
    time:DWORD;//消息创建的时间
    pt:TPoint;//消息创建时鼠标位置
end;
消息就是Windows就某个事情发生了而给出的一个通知。这个通知是一个记录类型,包含了消息类型以及其它信息。

2.常见消息,如
WM_ACTIVATE       $0006       窗体被激活或者取消激活
WM_CHAR           $0102       按下某键    
WM_TIMER          $0113       发生定时事件
WM_QUIT           $0012       程序将要退出

3.Windows消息系统
消息队列。Windows能够为所有的应用程序维护一个消息队列。应用程序再从队列中取出消息,分派给某个窗口。
消息循环。通过这个循环机制应用程序从消息队列中检索消息,分派,如此依次。
窗口过程。每个窗口都有一个窗口过程来接受传递给窗口的消息,它的任务是获取信息后然后响应它。窗口过程是一个回调函数 ;处理了一个消息后,它通常返回一值给Windows/


4.Delphi中的消息处理
所谓消息处理,就是应用程序以某种方式响应Windows消息。在Delphi中,每个消息都有各自的过程,须满足3个条件:
这个过程必须是一个对象中的方法
这个过程必须有一个var参数,变量的类型TMessage或其它特殊消息记录。
声明这个过程时,必须使用message指示符,后面跟要处理的消息的常量值。

例如:
procedure WMPaint(var Msg:TWMPaint);message WM_PAINT;
这就是Delphi中消息处理的语法。

5.对Result域赋值
当处理某些Windows消息时,Windows希望返回一个值。
procedure TForm1.WMCtlColor(var Msg:TWMCtlColor);
var
BrushHand: hBrush;
begin
inherited;
{创建一个画刷的句柄,并放进BrushHand变量}
Msg.Result := BrushHand;
end;

6.发送消息
Perform      
function TControl.Perform(Msg:Cardinal;WParam,LParam:Longint):Longint;
VCL的Perform()方法适用于所有的TControl派生对象调用Perform后,它要等消息得到处理后才返回。

有的时候,可能需要向一个只知其句柄的窗口发送消息 ,可以通过下面2个API函数。
function SendMessage(hWnd:HWND; Msg:UINT; WParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
function PostMessage(hWnd:HWND; Msg:UINT; WParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
它们的区别是,SendMessage返回此消息被处理的结果值,而PostMessage返回一个布尔值,表示消息是否已被放到消息队列中。

7.自定义消息
有些情况下,一个应用程序可能需要向自己发送消息,或者在两个应用程序之间发送消息。你会有这样一个问题:“为什么要发送消息而不是直接调用一个过程”。这个问题问得好,有这样几个答案。首先,消息可以让你不需要知道接受者的确切类型。同时,消息可以有选择地处理。如果接收者对消息没有做任何处理,不会造成任何后果。最后,消息可以广播给多个接收者,而要同时调用几个过程则比较困难。
(1)在应用程序发送消息
const SX_MYMESSAGE= WM_USER + 100;

begin
    SomeForm.Perform(SX_MYMESSAGE,0,0);
    {或者}
    SendMessage(SomeForm.Handle,SX_MYMESSAGE,0,0);
    .
    .
    .
end;

然后声明一个普通的消息处理过程来处理SX_MYMESSAGE的消息。
TForm1=class(TForm)
    .
    .
    .
private
    procedure SXMyMessage(var Msg:TMessage);message SX_MYMESSAGE;
end;

处理用户自定义消息与处理标准Windows消息几乎没有什么不同,真正的关键在于,必须声明一个消息常量,它的值必须从WM_USER+100开始。最好为自定义的消息起一个表明它的用途的名字。

(2)在应用程序之间发送消息
如果在两个或者多个应用程序之间发送消息,那么最好调用RegisterWindowMessage()这个函数来确保每个应用程序使用一致的消息编号。

(3)广播消息
TWinControl的派生对象可以调用Broadcast()来向它的子控件广播一个消息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值