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. css 样式 图片平铺整个界面

    比如一个容器(body,div,span)中设定一个背景.这个背景的长宽值在css2.1之前是不能被修改的. 所以实际的结果是只能重复显示,所以出现了repeat,repeat-x,repeat-y, ...

  2. 模拟 Coder-Strike 2014 - Round 1 A. Poster

    题目地址:http://codeforces.com/problemset/problem/412/A /* 模拟:题目没看懂,但操作很简单,从最近的一头(如果不在一端要先移动到一端)往另一头移动,顺 ...

  3. html加强

    <html> <head><title>hello</title></head> <body> <p>段落</ ...

  4. POJ2125 Destroying The Graph(二分图最小点权覆盖集)

    最小点权覆盖就是,对于有点权的有向图,选出权值和最少的点的集合覆盖所有的边. 解二分图最小点权覆盖集可以用最小割: vs-X-Y-vt这样连边,vs和X部点的连边容量为X部点的权值,Y部和vt连边容量 ...

  5. ! cocos2d 同一个sprite的触控问题

    如果对一个A sprite添加触控,然后在一个场景中创建四个A的实例,那么1234逐个添加的话,只有最后一个会被点击到.其他的将不会响应.

  6. linux tar 备份命令

    转载:http://www.douban.com/note/57861194/ tar [-cxtzjvfpPN] 文件与目录 ….参数:-c :建立一个压缩文件的参数指令(create 的意思):- ...

  7. 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...

  8. Google Code Jam 2010 Round 1B Problem B. Picking Up Chicks

    https://code.google.com/codejam/contest/635101/dashboard#s=p1   Problem A flock of chickens are runn ...

  9. JAVA_RSA密钥生成

    在网上找了下RSA的密钥的创建,结果全是用java序列化PublicKey和PrivateKey来保存,就自己写了个RSA公钥和私钥的创建,及进行Base64编码后保存. 这里用到了 bcprov-j ...

  10. log4j - 配置文件

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息. 通过配置,可以创建出Log4J的运行环 ...