低级鼠标键盘钩子的疑问。

doudou070801 doudou070801 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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.




为什么鼠标处的句柄一直都是找不到的状态。。??
...全文

相关推荐

评论 10
收藏 已收藏
分享
返回顶部
doudou070801
Windows SDK/API 1,184 成员 22,326 内容