请教:怎样监测到系统是否有键盘或鼠标事件 截留系统消息参考《Delphi 5 开发人员指南》 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谢谢,我用HOOK搞定了,有一个例子可供大家参考先是DLLlibrary HKTest;{ 按下Ctro+B,启动记事本 }uses SysUtils, Classes, HKProc in 'HKProc.pas';exports EnableHotKeyHook, DisableHotKeyHook;begin hNextHookProc:=0; procSaveExit:= ExitProc; ExitProc:= @HotKeyHookExit;end.unit HKProc;interfaceuses Windows, Messages, Dialogs,Shellapi;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;implementationfunction 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; //ShellExecute(hInstance,'open','Notepad.exe','','',sw_Normal); 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); hNextHookProc:=0 ; MessageBeep(0); MessageBeep(0); end; Result:= hNextHookProc =0;end;procedure HotKeyHookExit;begin //如果忘了解除HOOK,自动代理解除的动作 if hNextHookProc<>0 then DisableHotKeyHook; ExitProc:= procSaveExit;end;end.下面是测试程序program hk;uses Forms, Unit1 in 'Unit1.pas' {Form1};{$R *.RES}begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run;end.unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM} function EnableHotKeyHook: Bool;external 'HKTest.DLL'; function DisableHotKeyHook: Bool;external 'HKTest.DLL';procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin if DisableHotKeyHook then Showmessage('HotKey Testing... DONE!!');end;procedure TForm1.FormCreate(Sender: TObject);begin if EnableHotKeyHook then Showmessage('HotKey Testing...');end;end.这样按Ctrl+B就可调出写字板了 删除动态数组中元素问题 sql 取数据表最后20条记录,顺序排列 [100分求救]DELPHI调用VB写的DLL的过程为什么提示找不到入口!在线 结帖散分 hottey(点亮心灵)(基础补习中)看過來!~!!!!!!來接分!! 关于DBComboBox的问题,看到别人是数据库软件是这样的: 急......在线等待 急用!求 对实数进行“四舍五入”的函数! 如何卸载已安装的组件!!! 紧急求助? 关于ORACLE下插入BLOB字段后不能提交的问题 无法断开与access的连接 三层结构下,如何保存二进制大型数据 成为一名好程序员的必要因素是哪些!?
先是DLL
library HKTest;{ 按下Ctro+B,启动记事本 }uses
SysUtils,
Classes,
HKProc in 'HKProc.pas';exports
EnableHotKeyHook,
DisableHotKeyHook;
begin
hNextHookProc:=0;
procSaveExit:= ExitProc;
ExitProc:= @HotKeyHookExit;
end.unit HKProc;interfaceuses
Windows, Messages, Dialogs,Shellapi;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;implementationfunction 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;
//ShellExecute(hInstance,'open','Notepad.exe','','',sw_Normal);
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);
hNextHookProc:=0 ;
MessageBeep(0);
MessageBeep(0);
end;
Result:= hNextHookProc =0;
end;procedure HotKeyHookExit;
begin
//如果忘了解除HOOK,自动代理解除的动作
if hNextHookProc<>0 then DisableHotKeyHook;
ExitProc:= procSaveExit;
end;
end.下面是测试程序
program hk;uses
Forms,
Unit1 in 'Unit1.pas' {Form1};{$R *.RES}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}
function EnableHotKeyHook: Bool;external 'HKTest.DLL';
function DisableHotKeyHook: Bool;external 'HKTest.DLL';procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if DisableHotKeyHook then
Showmessage('HotKey Testing... DONE!!');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
if EnableHotKeyHook then
Showmessage('HotKey Testing...');
end;end.这样按Ctrl+B就可调出写字板了