DLL和HOOK得问题(高手请进)

caesar_ma1 2002-12-15 10:18:58
我这里有代码,有不明白之处,请高手看看:
有现成的,你不用费力了,呵呵。
library HKTest;

uses
HKProc in 'HKProc.pas';

exports
EnableHotKeyHook,
DisableHotKeyHook;

begin
hNextHookProc := 0;//这段初始值放在这里起到什么作用,它得执行顺序(和函数比)
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
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.


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.

问题1:在DLL中设置得初始值得作用,它得执行是在什么时候?
问题2:如果把函数编在DLL中,改动方法是什么?我尝试过,总是不成功
问题3:如果我要屏蔽ALT+F4,怎么找到ALT得代码?
...全文
64 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fwwxxjingling 2002-12-16
  • 打赏
  • 举报
回复
收藏,呵呵!
netfyee 2002-12-15
  • 打赏
  • 举报
回复
1.在加载dll时执行.
2.改动什么啊?不知道你问的什么意思?
3.const WH_KEYBoard_LL //系统键盘钩子
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD_LL,
KeyboardHookHandler,
HInstance,
0);
caesar_ma1 2002-12-15
  • 打赏
  • 举报
回复
ok,送分
yang6130 2002-12-15
  • 打赏
  • 举报
回复
//问题3:如果我要屏蔽ALT+F4,怎么找到ALT得代码?
//ALT ->VK_MENU
(GetKeyState(vk_Menu) < 0) and (wParam = 'VK_F4') then
caesar_ma1 2002-12-15
  • 打赏
  • 举报
回复
在代码当中函数的实现在单元文件里面,我想把它做到DLL里面去不想被别人看到原代码,怎么实现,就这个例子给出实现步骤!谢谢,高分送上!第三个问题你好像没有说明白,而且我感觉是画蛇添足?不好意思,一人之见

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧