我能在DELPHI 程序中 拦截 不是指向本程序窗体 WINDOWS消息吗? 我能在DELPHI 程序中 拦截 不是指向本程序窗体 WINDOWS消息吗? 多谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 肯定可以,就是没做过,呵呵。大概要用到hook吧。 可以用SetWindowHookEx安装全局Hook.如WH_MOUSE..WH_KEYBOARD.等。 bluenightsky() 告诉我如何?能给段代码吗?多谢! 最简单的方法就是: 点右上角的“搜索”,输入"钩子"按DELPHI大类搜索即有很多了。如: http://expert.csdn.net/Expert/topic/1569/1569791.xml?temp=.3465235 网上有很多例子的,你自己可以找找看。手头有个例子,不过不符合你的要求,看看吧--- Cut Here --- library HKTest; uses HKProc in 'HKProc.pas'; exports EnableHotKeyHook, DisableHotKeyHook; begin hNextHookProc := 0; procSaveExit := ExitProc; ExitProc := @HotKeyHookExit; end. --- Cut Here --- 2. 将以下的文字剪贴存成 HKProc.PAS (Note: HKTest.DPR 与 HKProc.PAS 建议储存在同一个目录) --- Cut Here --- unit HKProc; interface uses Windows, Messages; var hNextHookProc: HHook; procSaveExit: Pointer; function KeyboardHookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export; function EnableHotKeyHook: BOOL; export; function DisableHotKeyHook: BOOL; export; procedure HotKeyHookExit; far; implementation function KeyboardHookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export; const _KeyPressMask = $80000000; begin Result := 0; If iCode < 0 Then begin Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam); Exit; end; // 侦测 Ctrl + B 组合键 if ((lParam and _KeyPressMask) = 0) and (GetKeyState(vk_Control) < 0) and (wParam = Ord('B')) then begin Result := 1; WinExec('Notepad.exe', sw_Normal); // 记事本 end; end; function EnableHotKeyHook: BOOL; export; begin Result := False; if hNextHookProc < > 0 then Exit; // 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下 // 来, 免得 HOOK 呼叫链结断掉 hNextHookProc := SetWindowsHookEx(WH_KEYBOARD, KeyboardHookHandler, HInstance, 0); Result := hNextHookProc < > 0; end; function DisableHotKeyHook: BOOL; export; begin if hNextHookProc < > 0 then begin UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook hNextHookProc := 0; MessageBeep(0); MessageBeep(0); end; Result := hNextHookProc = 0; end; procedure HotKeyHookExit; begin // 如果忘了解除 HOOK, 自动代理解除的动作 if hNextHookProc < > 0 then DisableHotKeyHook; ExitProc := procSaveExit; end; end. --- Cut Here --- 3. 启动 Delphi 2.0 4. 开启 HKTest.DPR, 然後 Project | Build All 以产生 HKTest.DLL 5. File | New Application 开启一个新的专案 6. 将此专案 unit1 与 project1 存档, 请注意: 请存到与 HKTest.DLL 相同的目录中. 7. 在 Form1 上安置二个 TButton, 并撰写 OnClick 程式, 同时, 在 implementation 节中宣告 EnableHotKeyHook() 与 DisableHotKeyHook(), 修改後的程式应类似: ... ... implementation {$R *.DFM} function EnableHotKeyHook: BOOL; external 'HKTEST.DLL'; function DisableHotKeyHook: BOOL; external 'HKTEST.DLL'; procedure TForm1.Button1Click(Sender: TObject); begin if EnableHotKeyHook then ShowMessage('HotKey Testing...'); end; procedure TForm1.Button2Click(Sender: TObject); begin if DisableHotKeyHook then ShowMessage('HotKey Testing..., DONE!!'); end; end. 钩子贼简单,你看看delphi帮助会很明白。查setwindowshookex unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; i:integer; HookHandle: HHOOK;implementation{$R *.DFM}function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;begin if (Code = HC_ACTION) then if PMsg(Msg)^.Message = WM_mousemove then begin //showMessage('已经截获该消息'); i:=i+1; form1.Caption:=inttostr(i); end; Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));end;procedure TForm1.FormCreate(Sender: TObject);begin i:=0; HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改// HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);end;end.以上程序仅可以拦截本窗口的鼠标操作!!!!!高手请指教!!!谢谢 unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; i:integer; HookHandle: HHOOK;implementation{$R *.DFM}function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;begin if (Code = HC_ACTION) then if PMsg(Msg)^.Message = WM_mousemove then begin //showMessage('已经截获该消息'); i:=i+1; form1.Caption:=inttostr(i); end; Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));end;procedure TForm1.FormCreate(Sender: TObject);begin i:=0; HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改// HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);end;end.以上程序仅可以拦截本窗口的鼠标操作!!!!!高手请指教!!!谢谢 unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; i:integer; HookHandle: HHOOK;implementation{$R *.DFM}function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;begin if (Code = HC_ACTION) then if PMsg(Msg)^.Message = WM_mousemove then begin //showMessage('已经截获该消息'); i:=i+1; form1.Caption:=inttostr(i); end; Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));end;procedure TForm1.FormCreate(Sender: TObject);begin i:=0; HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改// HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);end;end.以上程序仅可以拦截本窗口的鼠标操作!!!!!高手请指教!!!谢谢 做成DLL就可以拦截其它窗口的操作了!!!!!不知我说的对不对,,呵呵 请做成DLL..系统级的HOOK只能用DLL delphi 中主丛窗体时,如何在把创建的子窗体做为菜单项放到主窗体的菜单中 dbgrid 导出到excel 关于字体大小等方面的问题 在一个编辑框中按下回车键后让焦点进入下一个编辑框,如何实现? 我win2003上在加载从win2000导下来的中间件(com+)不能安装,报错,请问如何安装。 感谢 12rain 提醒了我!各位停止跟贴灌水吧,学习才是重要的 关于通过字符为基础类来建立窗体或空件的讨论 一个高深的问题 dbgrid和stringgrid有什么区别? 寻找好用的图象处理控件 發送短信 关于类型常量的问题 [共享]数万个整理好的ICON下载
大概要用到hook吧。
告诉我如何?能给段代码吗?
多谢!
点右上角的“搜索”,输入"钩子"按DELPHI大类搜索即有很多了。
如:
http://expert.csdn.net/Expert/topic/1569/1569791.xml?temp=.3465235
手头有个例子,不过不符合你的要求,看看吧
--- Cut Here ---
library HKTest; uses
HKProc in 'HKProc.pas'; exports
EnableHotKeyHook,
DisableHotKeyHook; begin
hNextHookProc := 0;
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
--- Cut Here ---
2. 将以下的文字剪贴存成 HKProc.PAS
(Note: HKTest.DPR 与 HKProc.PAS 建议储存在同一个目录) --- Cut Here ---
unit HKProc; interface uses
Windows, Messages; var
hNextHookProc: HHook;
procSaveExit: Pointer; function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
function EnableHotKeyHook: BOOL; export;
function DisableHotKeyHook: BOOL; export;
procedure HotKeyHookExit; far; implementation function KeyboardHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
_KeyPressMask = $80000000;
begin
Result := 0;
If iCode < 0 Then
begin
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;
// 侦测 Ctrl + B 组合键
if ((lParam and _KeyPressMask) = 0) and
(GetKeyState(vk_Control) < 0) and (wParam = Ord('B')) then
begin
Result := 1;
WinExec('Notepad.exe', sw_Normal); // 记事本
end;
end; function EnableHotKeyHook: BOOL; export;
begin
Result := False;
if hNextHookProc < > 0 then Exit;
// 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下
// 来, 免得 HOOK 呼叫链结断掉
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookHandler,
HInstance,
0);
Result := hNextHookProc < > 0;
end; function DisableHotKeyHook: BOOL; export;
begin
if hNextHookProc < > 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
MessageBeep(0);
MessageBeep(0);
end;
Result := hNextHookProc = 0;
end; procedure HotKeyHookExit;
begin
// 如果忘了解除 HOOK, 自动代理解除的动作
if hNextHookProc < > 0 then DisableHotKeyHook;
ExitProc := procSaveExit;
end; end.
--- Cut Here --- 3. 启动 Delphi 2.0 4. 开启 HKTest.DPR, 然後 Project | Build All 以产生 HKTest.DLL 5. File | New Application 开启一个新的专案 6. 将此专案 unit1 与 project1 存档, 请注意: 请存到与 HKTest.DLL
相同的目录中. 7. 在 Form1 上安置二个 TButton, 并撰写 OnClick 程式, 同时,
在 implementation 节中宣告 EnableHotKeyHook() 与
DisableHotKeyHook(), 修改後的程式应类似:
...
...
implementation {$R *.DFM} function EnableHotKeyHook: BOOL; external 'HKTEST.DLL';
function DisableHotKeyHook: BOOL; external 'HKTEST.DLL'; procedure TForm1.Button1Click(Sender: TObject);
begin
if EnableHotKeyHook then
ShowMessage('HotKey Testing...');
end; procedure TForm1.Button2Click(Sender: TObject);
begin
if DisableHotKeyHook then
ShowMessage('HotKey Testing..., DONE!!');
end; end.
查setwindowshookex
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
i:integer;
HookHandle: HHOOK;
implementation{$R *.DFM}function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
begin
if (Code = HC_ACTION) then
if PMsg(Msg)^.Message = WM_mousemove then begin
//showMessage('已经截获该消息');
i:=i+1;
form1.Caption:=inttostr(i);
end;
Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改
// HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);
end;
end.
以上程序仅可以拦截本窗口的鼠标操作!!!!!
高手请指教!!!
谢谢
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
i:integer;
HookHandle: HHOOK;
implementation{$R *.DFM}function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
begin
if (Code = HC_ACTION) then
if PMsg(Msg)^.Message = WM_mousemove then begin
//showMessage('已经截获该消息');
i:=i+1;
form1.Caption:=inttostr(i);
end;
Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
end;procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改
// HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);
end;
end.
以上程序仅可以拦截本窗口的鼠标操作!!!!!
高手请指教!!!
谢谢
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:integer;
HookHandle: HHOOK;
implementation{$R *.DFM}
function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
begin
if (Code = HC_ACTION) then
if PMsg(Msg)^.Message = WM_mousemove then begin
//showMessage('已经截获该消息');
i:=i+1;
form1.Caption:=inttostr(i);
end;
Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);???? 是不是这句有问题,如何改
// HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,0);
end;
end.
以上程序仅可以拦截本窗口的鼠标操作!!!!!
高手请指教!!!
谢谢
系统级的HOOK只能用DLL