如何写一个程序随时监视的按键。(nil)(50分)

  • 主题发起人 主题发起人 shopman
  • 开始时间 开始时间
对不起,是随时监视的鼠标的按键。
 
use hook!!!!!!
 
用钩子函数
HHOOK SetWindowsHookEx(
int idHook, // 钩子的类型
HOOKPROC lpfn, // 回调函数的地址
HINSTANCE hMod, // 应用程序实例的句柄
DWORD dwThreadId // 钩子函数所对应的线程
);
 
a mouse-hook stuff, see my question about mouse hook
or search the keyword "mouse hook"
 
使用mouse hook
需要以下api命令
setwindowshookex,
callnexthookex,
unhookwindowshookex.
你要监视任何一个程序的鼠标动作.必须使用dll动态连接库来拦截鼠标消息.
你可以找大富翁中回答的问题.里面有.
不明白的话问我
sunstone@263.net
 
不是很难,我有一个程序(含原码)
可以找我要!
 
keboy:你能把这个原码传给我吗? xia_renjie@yahoo.com

众位大哥在何处能找到较全面的API资料.
 
我查看了“CJ”的“mouse hook”的贴子,上面的例子也行,但是只能在form内
有用。我又查看了一下相关的贴子知道要写成DLL还要“内存映射文件”因为delphi
不技持数据共享段,“内存映射文件”这怎么做,支持支持。
 
sunstone兄:下列API函数的参数给详解详解吧。
setwindowshookex,
callnexthookex,
unhookwindowshookex.
 
这东西,在Delphi中有这类的例子。
你不妨去看看。
在Demos目录下的AppEvents中。
 
用hook函数
你要监视任何一个程序的鼠标动作.必须使用dll动态连接库来拦截鼠标消息.
SetWindowsHookEx(int idHook,HOOKPROC lpfn, HINSTANCE hMod,
DWORD dwThreadId);
其中 idhook ->钩子的类型
lpfn ->回调函数的地址
hmod ->应用程序实例的句柄
dwthreadid ->钩子函数所对应的线程
例子: hnexthookproc:=setwindowshookex(WH_MOUSE,@YourProcedure,hinstance,0);
idhook 钩子类型.你可以根据需要选择.
lpfn 替换钩子的程序
hnexthookpro为hook变量.
dwthreadid应为0,这样对所有程序都可用.
hmod应为hinstance,这样再dll中,对所有程序的线程都可用.

CallNextHookEx(HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam);
其中 hhk ->替换钩子程序的句柄
ncode ->替换钩子程序(你的程序yourprocedure)中的icode
wparam ->消息的附加信息
lparam ->消息的附加信息

例子: result := callnexthookex(hnexthookproc, icode, wp, longint(@Msg));
callnexthookex必须出现在yourprocedure中, 档调用失败或成功时,都必须用此函数
来回放钩住的信息

UnhookWindowsHookEx(HHOOK hhk);
其中 hhk ->替换钩子程序的句柄
例子:unhookwindowshookex(hnexthookproc);
当不是用钩子时,必须释放它

送你一个钱达智先生的键盘钩子的例子:

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;
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;
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
if hNextHookProc <> 0 then DisableHotKeyHook;
ExitProc := procSaveExit;
end;

end.



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.
 
sunstone: 在function EnableHotKeyHook: BOOL; export;中SetWindowsHookEx
函数指向的回调函数KeyboardHookHandler为什么是三个参数,这三个参数内容是什
么,如何传递的。
 
以KeyboardProc为关键字查查win32 api帮助就知道了.
 
后退
顶部