zoukankan      html  css  js  c++  java
  • Windows消息【一】 消息队列

    看了MSDN后,以下是我个人的理解!

    消息能够被分为「队列化消息」和「非队列化消息」。

    队列化消息是指当程序发生某事件时,由Windows主动捕获并把消息放入系统消息队列中,而程序在运行时会初始化一个消息泵,该消息泵用于抽取系统消息队列中的与之相关的消息,并把之分发到相应窗口函数上!

    非队列化消息不走消息泵,而是直接分发到相应的窗口函数上!

     队列化消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP消息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。队列化消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。(使用PostMessage来发送队列消息)

    非队列化消息则是其它消息。在许多情况下,非队列化消息来自呼叫特定的Windows函数(使用SendMessage来发送非队列化消息)

    咱们看看消息泵长什么样:

    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);//只有队列消息才会处理OnMessage函数
          if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and//处理完毕要加标识,handled:=True;
            not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
          begin
            TranslateMessage(Msg);
            DispatchMessage(Msg);//分发到各个窗口函数中
          end;
        end
        else
          FTerminate := True;
      end;
    end;
    View Code

    由此理论依据我们可以得出结论:

    使用Application.OnMessage事件是获取不到非队列化消息的!

  • 相关阅读:
    1030 完美数列 (25 分)
    1029 旧键盘 (20 分)
    数据库命令失败原因汇总
    代码有中文括号,导致错误
    win10笔记本触控板使用指南
    (已解决)vsC#控制台应用添加System.Windows.Forms引用失败(精通C#)
    ildasm中Ctrl+M闪退的问题(已解决, 精通C# 15.1)
    C#控制台应用(.NET Core)添加System.Windows.Forms失败(已解决)
    知识点_指针_增加对指针的理解
    自己写出的Bug_应是%f却写成%d
  • 原文地址:https://www.cnblogs.com/key-ok/p/3358962.html
Copyright © 2011-2022 走看看