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. 找规律 SGU 126 Boxes

    题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=126 /* 找规律,智商不够,看了题解 详细解释:http://blog.csdn. ...

  2. ural 1269. Obscene Words Filter

    1269. Obscene Words Filter Time limit: 0.5 secondMemory limit: 8 MB There is a problem to check mess ...

  3. Web 设计新趋势: 使用 SVG 代替 Web Icon Font

    如果你还在使用 Icon Font 作为网页中显示图标的实现方案,那么你可能有点 Out 了. 由于使用 Icon Font 显示图标存在一些缺陷,开发者们一直在致力于探索使用 SVG 作为替代的方法 ...

  4. 【wikioi】1295 N皇后问题

    题目链接 算法:DFS 刚开始卡了我一下,我竟然傻到用二维来放皇后= =.导致一直TLE.... 其实用1维就行了的,下标为行(列),值为列(行) 我是用下标为列做的. 上代码 #include &l ...

  5. 【wikioi】1281 Xn数列(矩阵乘法)

    http://wikioi.com/problem/1281/ 矩阵真是个神奇的东西.. 只要搞出一个矩阵乘法,那么递推式可以完美的用上快速幂,然后使复杂度降到log 真是神奇. 在本题中,应该很快能 ...

  6. 【wikioi】1285 宠物收养所

    题目链接:http://www.wikioi.com/problem/1285/ 算法:Splay 刚开始看到这题,就注意到特征abs了,并且数据n<=80000显然不能暴力,只能用nlgn的做 ...

  7. jQuery Mobile高手必备的十大技巧和代码片段

    与任何新技术一样,常常难就难在如何开始入手. 有鉴于此,我们整理出了与jQuery Mobile库有关的我认为最便利的一些技巧.方法和代码片段. 由于本文不是旨在全面介绍使用jQuery Mobile ...

  8. TCP和UDP的135、137、138、139、445端口的作用

    如果全是2000以上的系统,可以关闭137.138.139,只保留445 如果有xp系统,可能以上四个端口全部要打开 无论你的服务器中安装的是Windows 2000 Server,还是Windows ...

  9. dig 命令详解(转载) - 阿权的书房

    在 unix 和 linux 下,建议大家使用 dig 命令来代替 nslookup. dig 命令的功能比 nslookup 强大很多,不像 nslookkup 还得 set 来 set 去的,怪麻 ...

  10. NBOJv2 1022 短信篮球(种类并查集)

    Problem 1022: 短信篮球 Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %lld ...