unit ScWndProc;

interface
uses Forms, Messages; const
DDGM_FOOMSG = WM_USER; //自定义消息 implementation uses windows,sysutils,Dialogs; var
WProc : Pointer; function NewWndProc(handle: hWnd; msg,wParam,lParam: LongInt): LongInt ;
stdcall;
begin
if msg = DDGM_FOOMSG then
ShowMessage(Format('收到自定义消息 $%x',[msg])); result := CallWindowProc(WProc,handle, msg,wParam,lParam);
end; initialization
WProc := Pointer(SetWindowLong(application.Handle,GWL_WNDPROC
,integer(@NewWndProc)));
end.

//发送消息
SendMessage(application.Handle,DDGM_FOOMSG,0,0);


unit UnitSendVsPost;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TFrmSendPostMsg = class(TForm)
btnSendMessage: TButton;
btnPostMessage: TButton;
procedure btnSendMessageClick(Sender: TObject);
procedure btnPostMessageClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
OldWndProc : Pointer;
WndProcPtr : Pointer;
procedure WndMethod(var msg: TMessage);
procedure HandleAppMessage(var msg : TMsg; var handled : boolean);
public
{ Public declarations }
end; var
FrmSendPostMsg: TFrmSendPostMsg; implementation {$R *.dfm}
uses
ScWndProc; procedure TFrmSendPostMsg.WndMethod(var msg: TMessage);
begin
if msg.Msg = DDGM_FOOMSG then
begin
ShowMessage(Format('Message seen by WndMethod! value is: $%x',[msg.Msg]));
with msg do
result := CallWindowProc(OldWndProc,Application.Handle,msg,WParam,LParam);
end;
end; procedure TFrmSendPostMsg.HandleAppMessage(var msg : TMsg; var handled : boolean);
begin
if msg.message = DDGM_FOOMSG then
begin
ShowMessage(Format('Message seen by OnMessage! value is: $%x',[msg.message]));
//handled := true;
end;
end; procedure TFrmSendPostMsg.btnSendMessageClick(Sender: TObject);
begin
//发送消息
sendmessage(application.Handle,DDGM_FOOMSG,0,0);
end; procedure TFrmSendPostMsg.btnPostMessageClick(Sender: TObject);
begin
postmessage(application.Handle,DDGM_FOOMSG,0,0);
end; procedure TFrmSendPostMsg.FormCreate(Sender: TObject);
begin
application.OnMessage := HandleAppMessage; // set OnMessage handler
WndProcPtr := MakeObjectInstance(WndMethod);
OldWndProc := Pointer(SetWindowLong(Application.Handle,GWL_WNDPROC,Integer(WndProcPtr)));
end; procedure TFrmSendPostMsg.FormDestroy(Sender: TObject);
begin
SetWindowLong(Application.Handle,GWL_WNDPROC,LongInt(OldWndProc));
FreeObjectInstance(WndProcPtr);
end; end.

unit UnitHook;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TFrmHookWin = class(TForm)
lstMsg: TListBox;
btnSendMsg: TButton;
procedure btnSendMsgClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
function AppWindowHook(var message: TMessage): boolean;
public
{ Public declarations }
end; var
FrmHookWin: TFrmHookWin; implementation {$R *.dfm} function TFrmHookWin.AppWindowHook(var message: TMessage): boolean;
const
strLog = 'MsgID: $%x, WParam: $%x, LParam: $%x';
begin
Result := true;
with message do
lstMsg.Items.Add(Format(strLog,[Msg,WParam,LParam]));
end;
procedure TFrmHookWin.btnSendMsgClick(Sender: TObject);
begin
SendMessage(application.Handle,WM_NULL,0,0);
end; procedure TFrmHookWin.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(self.AppWindowHook);
end; procedure TFrmHookWin.FormDestroy(Sender: TObject);
begin
application.UnhookMainWindow(self.AppWindowHook);
end; end.

Delphi自定义窗口过程WinProc的更多相关文章

  1. 有谁知道Delphi中"窗口"的创建过程?

      求助:有谁知道Delphi中窗口的创建过程,此“窗口”不仅仅指 TForm 类型, 还包括一般的窗口控件,如TButton,TEdit等等,希望有能够十分详细的运作 过程,比如说CreatPara ...

  2. C#调用WinAPI及窗口过程

    C#调用WINAPI及Windows窗口消息的发与送 最近在做一个餐饮项目(C#Winform),其中有一块是做点菜宝接口的对接,点菜宝的厂商提供了一个WX.exe的驱动程序,这个驱动程序无直接打开, ...

  3. 从普通函数到对象方法 ------Windows窗口过程的面向对象封装

    原文地址:http://blog.csdn.net/linzhengqun/article/details/1451088 从普通函数到对象方法 ------Windows窗口过程的面向对象封装 开始 ...

  4. win32程序通过LPCREATESTRUCT中的lpCreateParams传递参数给窗口过程函数

    win32窗口程序中如果需要给窗口过程函数传递自定义参数,可以通过LPCREATESTRUCT结构体中的lpCreateParams进行传递. 创建窗口实例函数: m_hWnd = CreateWin ...

  5. win32编程中消息循环和WndProc()窗口过程函数

    原文地址:https://blog.csdn.net/zxxSsdsd/article/details/45504383 在win32程序的消息循环函数中  while (GetMessage (&a ...

  6. WPF中使用WindowChrome美化窗口过程中的一个小问题

    WPF中使用WindowChrome美化窗口,在园子里有几篇不错的文章,我也是参考练习过程中发现的问题,并记录下来. 在看过几篇教程后,给出的窗口很多出现这样一个问题,如果设置了窗口标题栏的高度大于默 ...

  7. WPF WindowChrome 自定义窗口

    1.wpf自定义窗口: WindowChrome类描述:https://msdn.microsoft.com/zh-cn/library/system.windows.shell.windowchro ...

  8. 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good

    笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...

  9. QT自定义窗口

    qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ...

随机推荐

  1. ANSYS:Negative pivot encountered

    做柔性体仿真,从ANSYS导入模态中性文件时有这个报错. Negative pivot encountered. This is  likely caused by insufficient disp ...

  2. ural 1243. Divorce of the Seven Dwarfs

    1243. Divorce of the Seven Dwarfs Time limit: 1.0 secondMemory limit: 64 MB After the Snow White wit ...

  3. bzoj1030 [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2654  Solved: 1100[Submit][Stat ...

  4. BZOJ3828 : [Poi2014]Criminals

    对于每个位置求出L[i]表示左边最大的j,满足从j开始到i-1中存在第一个子序列 R[i]表示右边最小的j,满足从j开始到i-1中存在第二个子序列 然后枚举颜色是相遇点的位置,如果L[i]左边.R[i ...

  5. 【BZOJ】1180: [CROATIAN2009]OTOCI & 2843: 极地旅行社(lct)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1180 今天状态怎么这么不好..................................... ...

  6. java正则表达式过滤html标签

    import java.util.regex.Matcher; import java.util.regex.Pattern; /** * <p> * Title: HTML相关的正则表达 ...

  7. 运用正则表达式在Asp中过滤Html标签代码的四种不同方法

    Function RemoveHTML(strHTML)Dim objregExp, Match, MatchesSet objRegExp = New RegexpobjRegExp.IgnoreC ...

  8. 用java简单的实现单链表的基本操作

    package com.tyxh.link; //节点类 public class Node { protected Node next; //指针域 protected int data;//数据域 ...

  9. 分布式架构高可用架构篇_03-redis3集群的安装高可用测试

    参考文档 Redis 官方集群指南:http://redis.io/topics/cluster-tutorial Redis 官方集群规范:http://redis.io/topics/cluste ...

  10. [故障处理]联想笔记本故障0x0000007B

    同事笔记本故障,莫名其妙的快捷方式就找不到了.开始程序中的内容也无法正常查看. 解决步骤: 1.怀疑用户配置的问题,新建一个用户,没有解决. 2.使用自带的一键恢复ThinkVantage,恢复后,重 ...