通过以下实例拦截窗体WM_SysCommand消息,我们可以获取到很多有趣的数据。

一、程序界面

  二、程序代码

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
ListBox1: TListBox;
private
{ Private declarations }
procedure MyWMSysCommand(var AMessage: TWMSysCommand); message WM_SysCommand;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm}
procedure Tform1.MyWMSysCommand(var AMessage: TWMSysCommand);
var
str: string;
begin
case AMessage.CmdType of //可能通过查找TWMSysCommand结构体查找wParam以下参数
SC_SIZE:
str := 'SIZE ';
SC_MOVE:
str := 'MOVE ';
SC_MINIMIZE:
str := 'MINIMIZE ';
SC_MAXIMIZE:
str := 'MAXIMIZE ';
SC_NEXTWINDOW:
str := 'NEXTWINDOW ';
SC_PREVWINDOW:
str := 'PREVWINDOW ';
SC_CLOSE:
str := 'CLOSE ';
SC_VSCROLL:
str := 'VSCROLL ';
SC_HSCROLL:
str := 'HSCROLL ';
SC_MOUSEMENU:
str := 'MOUSEMENU ';
SC_KEYMENU:
str := 'KEYMENU ';
SC_ARRANGE:
str := 'ARRANGE ';
SC_RESTORE:
str := 'RESTORE ';
SC_TASKLIST:
str := 'TASKLIST ';
SC_SCREENSAVE:
str := 'SCREENSAVE ';
SC_HOTKEY:
str := 'HOTKEY ';
SC_DEFAULT:
str := 'DEFAULT ';
SC_MONITORPOWER:
str := 'MONITORPOWER ';
SC_CONTEXTHELP:
str := 'CONTEXTHELP ';
SC_SEPARATOR:
str := 'SEPARATOR '; 61441:
str := '拖动左边框 ';
61442:
str := '拖动右边框 ';
61443:
str := '拖动上边框 ';
61444:
str := '拖动左上角 ';
61445:
str := '拖动右上角 ';
61446:
str := '拖动下边框 ';
61447:
str := '拖动左下角 ';
61448:
str := '拖动右下角 ';
61458:
str := '拖动标题栏 ';
61558:
str := '横向滚动条滚动';
61574:
str := '双击横向滚动条';
61575:
str := '纵向滚动条滚动';
61559:
str := '双击纵向滚动条';
61587:
str := '点击最小化图标';
61490:
str := '在非最大化时双击标题栏';
61730:
str := '在最大化时双击标题栏';
end;
ListBox1.Items.Add(str);
ListBox1.Items.Add(Format('X:%dY:%2d', [AMessage.XPos, AMessage.YPos]));
ListBox1.Perform(WM_VSCROLL, SB_BOTTOM, 0); //移动到VScroll到底部,保证新加入的文字总是可见。可以通过查找 TWMScroll结构体查找第二个参数SB_XXXX
inherited; //注释这个一行,窗口将无法关闭
end; end.

深入delphi编程理解之消息(四)使用TWMSysCommand结构体的WM_SysCommand消息应用的更多相关文章

  1. 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

    通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...

  2. 深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解

    一.delphi发送消息的函数主要有以下三个: (一).SendMessage函数,其原型如下: function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; ...

  3. 深入delphi编程理解之消息(三)发送消息函数的一般应用实例

    通过对消息函数(SendMessage.PostMessage.Perform)的一般应用,来说明sendmessage.postmessage函数和perform 方法调用方式和结果的区别. 一.程 ...

  4. Windows消息队列(优先队列,结构体中放比较函数)

    Windows消息队列 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中.同时,如果队列不是空的 ...

  5. iOS学习笔记44-Swift(四)枚举和结构体

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  6. 深入delphi编程理解之消息(六)无窗口单元消息的创建、接受及dispatch模式编程

    一.程序界面 二.程序代码 (一).主界面代码 //========================================================================== ...

  7. 深入delphi编程理解之消息(五)重写(override)dispatch、wndproc方法和Application.OnMessage事件

    dispatch.wndproc是VCL framework在TWinCtronl定义的虚拟方法,下面程序通过重写(override)这两函数拦截WM_LBUTTONDOWN消息,来与Applicat ...

  8. 深入delphi编程理解之接口(一)接口与类的异同及接口的声明和实现

    一.抽象类与接口的异同 接口简单的理解可认为是一个抽象类,我们先定义一个抽象类和接口来对比之间的异同,代码如下: type IFormattedNumber = interface //定义接口 fu ...

  9. Delphi中运行时改变panel的位置及大小(WM_SysCommand消息配合参数使用,很奇妙) good

    procedure TForm1.pnl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Inte ...

随机推荐

  1. 17个IoC 软件包和项目

    原文:17个IoC 软件包和项目 1.Autofac GitHub:https://github.com/autofac/Autofac 描述:An addictive .NET IoC contai ...

  2. AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解

    AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast  阅读约 27 分钟 抽象语法树(AST),是一 ...

  3. ASP.NET Razor简介

    Razor 不是一种编程语言.它是服务器端的标记语言. 什么是 Razor? Razor 是一种标记语法,可以让您将基于服务器的代码(Visual Basic 和 C#)嵌入到网页中. 基于服务器的代 ...

  4. oracle 锁表处理

    1.查询 select object_name,machine,s.sid,s.serial#from v$locked_object l,dba_objects o ,v$session swher ...

  5. NetMQ用作IPC的实例

    发送端/接收端 using System; using System.Threading; using NetMQ; using NetMQ.Sockets; namespace NetMQIPCSe ...

  6. 我竟然把today = new Date();写在了全局变量里面

    let today = new Date();应该在每次用之前重新生成新的对象,因为对于例如 today.getTime() 这种方法,取得是today对象的time,而非调用today对象取得实时时 ...

  7. Apache Kafka(十)Partitions与Replication Factor 调整准则

    Partitions与Replication Factor调整准则 Partition 数目与Replication Factor是在创建一个topic时非常重要的两个参数,这两个参数的取值会直接影响 ...

  8. Android 服务和广播的使用

    Android 服务和广播的使用 服务的使用 创建服务类 创建一个java文件,取名 mService.java,继承Service. public class mService extends Se ...

  9. java位移运算符|And&,操作二进制

    在java中 逻辑运算符有四种:&  ,  |,  &&,  || &: 如果第一个条件是fasle,还会判断第二个条件,只要有一个条件不满足,结果就返回false; ...

  10. FIR滤波器工作原理(算法)以及verilog算法实现(包含与IIR的一些对比)

    滤波器在2017年IC前端的笔试中,出现频率十分的高.不论今后是否会涉及,还是要记住一些会比较好.接下来就将从这四个方面来讲解,FIR数字滤波器的工作原理(算法)与verilog实现. ·什么是FIR ...