低级鼠标键盘钩子的疑问。
unit LLKBMouthHook;
interface
uses
Windows, Messages, SysUtils;
function StartHookKeyMouse: boolean;
function StopHookKeyMouse: boolean;
implementation
type
tagKBDLLHOOKSTRUCT = packed record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
type
PMSLLHOOKSTRUCT = ^MSLLHOOKSTRUCT;
MSLLHOOKSTRUCT = record
pt: TPoint;
hwnd:HWND;
mouseData: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
const
WH_KEYBOARD_LL = 13;
WH_MOUSE_LL = 14;
var
hhkLowLevelKybd: HHook = 0;
hhkLowLevelMouse: HHook = 0;
procedure WriteScreen(TmpStr:string);
var
ScreenDC: HDC;
begin
// 输出到屏幕
ScreenDC := GetDC(0);
TextOut(ScreenDC, 0, 0, PChar(TmpStr), Length(TmpStr));
ReleaseDC(0, ScreenDC);
end;
// 取窗口类名
function GetWinClass(hWnd: HWnd): string;
var
szClassName: array[0..20] of Char;
begin
szClassName[GetClassName(hWnd, szClassName, 20)] := #0;
Result := szClassName;
end;
// 取窗体文字
function GetWinTitle(hWnd: HWnd): string;
var
szWindowText: array[0..20] of Char;
szTextLength: Integer;
begin
szTextLength := SendMessage(hWnd, WM_GETTEXT, 20, Integer(@szWindowText[0]));
szWindowText[szTextLength] := #0;
Result := szWindowText;
end;
function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
p: PKBDLLHOOKSTRUCT;
fEatKeystroke: BOOL;
begin
if (nCode = HC_ACTION) then
begin
p := PKBDLLHOOKSTRUCT(lParam);
case wParam of
WM_KEYDOWN:
begin
//键盘按下事件
if p.vkCode = VK_RETURN then WriteScreen('回车按下');
end;
end;
end;
Result := 0;
Result := CallNextHookEx(0, nCode, WParam, LParam);
end;
function LowLevelMouseProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
p: PMSLLHOOKSTRUCT;
begin
if (nCode = HC_ACTION) then
begin
p := PMSLLHOOKSTRUCT(lParam);
case wParam of
WM_LBUTTONDOWN:
begin
if p.hwnd<>0 then Writescreen('有句柄') else WriteScreen('无句柄');
//无论鼠标点什么程序上的按钮,都取不到鼠标下控件的句柄,为什么呢?
end;
end;
Result := 0;
Result := CallNextHookEx(0, nCode, WParam, LParam);
end;
end;
function StartHookKeyMouse: boolean;
begin
if hhkLowLevelKybd = 0 then hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);
if hhkLowLevelMouse = 0 then hhkLowLevelMouse := SetWindowsHookEx(WH_MOUSE_LL, LowlevelMouseProc, HInstance, 0);
result := (hhkLowLevelKybd <> 0) or (hhkLowLevelMouse <> 0);
end;
function StopHookKeyMouse: boolean;
begin
if hhkLowLevelKybd <> 0 then
begin
UnhookWindowsHookEx(hhkLowLevelKybd);
hhkLowLevelKybd := 0;
end;
if hhkLowLevelMouse <> 0 then
begin
UnHookWindowsHookEx(hhkLowLevelMouse);
hhkLowLevelMouse := 0;
end;
result := true;
end;
initialization
hhkLowLevelKybd := 0;
hhkLowLevelMouse := 0;
finalization
if hhkLowLevelKybd <> 0 then UnhookWindowsHookEx(hhkLowLevelKybd);
if hhkLowLevelMouse <> 0 then UnhookWindowsHookEx(hhkLowLevelMouse);
end.
为什么鼠标处的句柄一直都是找不到的状态。。??
...全文
相关推荐
QT-HOOK鼠标键盘_低级钩子
本资源使用VS2015开发,QT版本5.10,截取处理Windows消息,HOOK鼠标键盘,获取所有按键信息,可区分鼠标侧键及滚轮上下滚动消息。
低级鼠标钩子.zip
低级鼠标钩子.zip 成品 VC编写的 可以截获系统鼠标消息,并查看到参数信息如wParam,lParam, 还显示是什么鼠标事件,如左键按下,弹起等。
qt 系统钩子获取鼠标键盘事件
qt 系统钩子获取系统底层鼠标键盘事件 编译通过
C#按键精灵,低级鼠标键盘Hook及发送按键 带源码
两个工具,简单实现了按键精灵的功能,带源码。 1.从xml脚本中读取数据,简易的模拟鼠标键盘输入。调用自己SendInput API封装好的DLL。 2.全局鼠标键盘钩子,生成模拟输入脚本。
【低级键盘鼠标钩子范例】
关于钩子的例程网上很多;而关于低级键盘鼠标钩子的例子却很少!作者:李学功2005.4.15注意在Windows NT 4 sp3以上系统才能使用


Windows SDK/API
