关于键盘钩子,请教(200分)

  • 主题发起人 主题发起人 godzhou
  • 开始时间 开始时间
G

godzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现监控键盘的按键,而且要实现如下的功能,比如说当打字的时候按下 c 的时候

把它截获,并改成 d 。不知道键盘钩子能不能实现。找了一个例子,

如下,不知道怎么改动了。

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;

这个例子是按下^B的时候运行notepad,

谢了先。

不过刚刚又发现,我把程序中的B改成了c,再按^c就不行了,奇怪!
另外
 
改种方法不可以吗???将回调函数改改就可以办到的!
 
怎么改回调函数,还望详细说说
 
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
//将这里改改就可以了,还不知道你要做什么,可以详细说说吗?
//先去洗澡,我的QQ:30362015,上面详细说说!
end;
end;
 
我也这样想的
改成:wParam:=ord('c'); ??
然后呢?

qq的服务器好像很忙,找不到你人。
 
你首先把unit改成library
因为windows下的Hook程序必须是dll
 
对,那个是写错了,程序里写的是ilbrary,否则运行不起来的。
/////////////////////////////////////////////////////////
这个问题我已经基本上解决,我现在可以做到如下的变换 c --> d

用到了keybd_event,但里面的参数只能传递 byte

而我如果要c-->一个unicode字符(2个byte)就麻烦了,恐怕不能这样做了。

我想是不是可以先屏蔽掉字符c,要通过获获得当前窗口(可能是TEdit或notepad或word)

的handle,然后直接向他传递一个unicode字符?

还望高手看看这种方法的可能性,如果给出代码最好了,谢谢!!
 
不好意思,前几天一直上不了论坛。
 
supergodzhou,我现在也头疼这个问题啊,找到delphi5开发人员指南上面有一个相似的例子,然后我改了改
可是一运行就死机,郁闷啊.
我现在主要是不知道JOURNALPLAYBACK类型的钩子该在哪里放,是和keyboard钩子一起放呢,还是
检测到按健再放?并且又何时结束呢?
回头我把我的原码给你发过去
 
后退
顶部