钓子程序代源

uses
Windows,SysUtils,Messages,Registry,ShlObj,Types,Classes;
const
LLKHF_ALTDOWN =KF_ALTDOWN shr 8;
WH_KEYBOARD_LL=13; //钩子种类,表示是低级键盘钩子

type
PKBDLLHOOKSTRUCT=^KBDLLHOOKSTRUCT;
{这个结构包含了一个低级键盘钩子的输入事件,
可以捕获键盘输入,具体查看MSDN}
KBDLLHOOKSTRUCT=record
vkCode:DWORD; //虚拟键码
scanCode:DWORD; //扫描码
flags:DWORD; //标志
time:DWORD;
dwExtraInfo:DWORD; //一些附加信息
end;

//------------------发送消息的过程-------------------//
Procedure SendText;
var
mainhwnd:THandle; //聊天主窗体句柄
texhwnd:THandle; //输入框句柄
begin
mainhwnd:=0;
//查找当前的工作状态的窗体,#32770是窗口类
mainhwnd:=FindWindowEx(GetForegroundWindow,mainhwnd,'#32770',nil);
if mainhwnd<>0 then
begin
//查找输入框的句柄
texhwnd:=FindWindowEx(mainhwnd,0,'AfxWnd42',nil);
texhwnd:=FindWindowEx(texhwnd,0,'RICHEDIT',nil);
//如果输入框里没有消息就取消发送
if SendMessage(texhwnd,WM_GETTEXTLENGTH,0,0)<1 then exit;
//取消输入框中文本的选中
SendMessage(texhwnd,EM_SetSel,-1,-1);
//向输入框中加入尾巴
SendMessage(texhwnd,EM_ReplaceSel,1,integer(pchar(' '+'QQ尾巴 by Sirius!')));
end;
end;//----------------------------end.

//-------------------钩子的回调函数----------------//
function KeyHookFunc(nCode:Integer;w_Param:WPARAM;l_Param:LPARAM):LRESULT;stdcall;
const VK_S=83; //Alt+S中的S的虚拟键码,在虚拟键码表上可以查看
var
bGetMsg:Boolean; //判断是否截获指定的消息
pk:PKBDLLHOOKSTRUCT; //键盘钩子的结构体
begin
bGetMsg:=False;
if nCode=HC_ACTION then
begin
case w_Param of //要截获的消息标识符,包括KeyDown和KeyUp
WM_KEYDOWN, {MSDN中有详细说明}
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
begin
//将消息包含的数据装入pk
pk:=PKBDLLHOOKSTRUCT(l_Param);
// 进行按键过滤
bGetMsg :=(((pk^.vkCode = VK_S) and
((pk^.flags and LLKHF_ALTDOWN) <> 0)) or
//上面截获的是Alt+S
((pk^.vkCode = VK_RETURN) and
((GetKeyState(VK_CONTROL) and $8000) <> 0)));
//上面截获的是Ctrl+Enter
end;
end;
end;
if bGetMsg then
begin
SendText; //截获消息后向输入框里加上尾巴
Result:=0; //将消息返回,尾巴就和别人输入的数据一起发送出去了
end
//如果没有截获指定消息就将向下传递
else Result:=CallNextHookEx(0,nCode,w_Param,l_Param);
end;//----------------------------end.

//-------------------------下钩子
KeyHook:=SetWindowsHookEx(WH_KEYBOARD_LL,
@KeyHookFunc,
HInstance,0

原文地址:https://www.cnblogs.com/martian6125/p/9631578.html