unit hkprocunit;interfaceuses Windows,Messages,SysUtils,Dialogs,CommCtrl,StrUtils;var hHk: HHOOK;//钩子的句柄值。 hkQQChat: HHOOK; hwQQChat: HWnd; tlQQChat: string; clsName: string; buf: array [0..1024] of char; const //QQ聊天窗口的类名 csQQ = '#32770'; function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean; stdcall; function EnableWheelHook : Boolean; stdcall; export; function DisableWheelHook: Boolean; stdcall; export;
implementation//钩子的处理函数 function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result:= 0; if Code<0 then begin Result:= CallNextHookEx(hkQQChat, Code, wParam, lParam); Exit; end else if Code = HCBT_ACTIVATE then begin //获取激活窗口的句柄,以及窗口类名,然后判断此窗口类名是否为#32770。 hwQQChat:= HWND(wParam); GetClassName(hwQQChat, buf, 1024); clsName:= string(buf);
if clsName = csQQ then begin //如果窗口类名是#32770,则遍枚举所有窗口,并将窗口句柄传入 //【这里仅仅做演示用,因为Windows中很多窗口的类名均为#32770,所以这样判断效率会很底,】 //【有兴趣的朋友可以根据QQ聊天窗口的特性来增加判断条件,从而提高效率。】 EnumWindows(@EnumWindowsTitleFunc, hwQQChat); end; end; end;function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall; begin if (Handle = lParam) and boolean(GetWindowText(Handle, buf, 256)) then begin //根据窗口句柄获得窗口标题 tlQQChat:= string(buf); //然后判断标题中是否包含"与...聊天"等相关字符,如果包括则此窗口为QQ聊天窗口 if (( pos ('等', tlQQChat)>0) and (pos('个会话', tlQQChat)>0)) then begin //确定为聊天窗口后遍修改窗口标题。 tlQQChat := AnsiReplaceStr(tlQQChat, '等', '我的文档'); tlQQChat := AnsiReplaceStr(tlQQChat, '个会话', '' ); SetWindowText(Handle, pchar(tlQQChat)); end;
//【同上,这个地方大家可以自由控制,不仅仅局限在QQ、MSN等聊天窗口。】 //【而且想要将标题改成什么也可以自由控制,如果能根据修改后的窗口图标来确定标题】 //【比如通过修改将窗口图标替换成Delphi的图标,然后标题修改为Delphi7,谁还能看出破绽呢?哈哈】 if ((pos('群 -', tlQQChat)>0) or (pos('高级群 -', tlQQChat)>0)) then begin tlQQChat := AnsiReplaceStr(tlQQChat, '群 -', '我的文档'); tlQQChat := AnsiReplaceStr(tlQQChat, '高级' , '' ); SetWindowText(Handle, pchar(tlQQChat)); end; end; Result :=True; end; function MouseHookProc(nCode: Integer;WParam: WPARAM;LParam:LPARAM): LRESULT;stdcall; var MouseHookStruct: ^TMOUSEHOOKSTRUCT;//这个结构Delphi在Windows单元有定义,直接用就可以了。 nState: SHORT;//得到键盘状态的GetKeyState函数的返回值。这是一个16位的数。 begin Result := 0; //最好首先给它一个返回值,不然会有警告的!记住这可不是C语言。 //当nCode小于0时表示还有其它的Hook必须把参数传给它。 //此时就要用Api函数CallNextHookEx让它调用下一个Hook!!!当然不用好像也可以。 if nCode<0 then Result := CallNextHookEx(hHk,nCode,WParam,LParam)//参数是现成的,直接用就可以了。 //详细的说明可以参考Win32 SDK else if wParam = WM_LBUTTONDBLCLK then //判断是不是鼠标左键双击事件 begin nState := GetKeyState(VK_CONTROL);//这个函数只有一个参数,就是要得到的键的//键值,这里用Windows的虚拟键值表示ctrl键。 if (nState and $80000000) = $80000000 then//如果按下了,那么返回值的最高位为1 begin //即是16进制的80000000,如果没有按下就返回0 MouseHookStruct := Pointer(LParam); //转换指针并付值给MouseHookStruct变量。 SendMessage(MouseHookStruct.hwnd,WM_PASTE,0,0);//如果条件都满足了就发送WM_PASTE(粘贴)消息 end; end; end;//启动钩子 function EnableWheelHook: Boolean; stdcall; export; begin if hkQQChat=0 then begin hkQQChat := SetWindowsHookEx(WH_CBT, @TitleHookProc, Hinstance, 0); Result := True; end else Result := False; end;//卸载钩子 function DisableWheelHook: Boolean; stdcall; export; begin if hkQQChat<>0 then begin UnHookWindowsHookEx(hkQQChat); hkQQChat := 0; Result := True; end else Result := False; end;在网上找的源码,我试过了,也不能控制最新版的QQ啦! 有没有谁做了改进,可以控制任何一个程序,只要传入进程名称就可以控制操作就最好!
首先要谢谢HSFZXJY的分享还有没有更好的东西啊?! 请高手们帮帮忙啦! 谢谢!
在form.OnKeyDOWN中写:if key=vk_return then begin sleep(5000); Sendmessage(GetActiveWindow,WM_KEYDOWN,VK_F12,0); end; 不好意思,我用手机写的。。
hHk: HHOOK;//钩子的句柄值。
hkQQChat: HHOOK;
hwQQChat: HWnd;
tlQQChat: string;
clsName: string;
buf: array [0..1024] of char; const
//QQ聊天窗口的类名
csQQ = '#32770';
function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean; stdcall;
function EnableWheelHook : Boolean; stdcall; export;
function DisableWheelHook: Boolean; stdcall; export;
implementation//钩子的处理函数
function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result:= 0;
if Code<0 then
begin
Result:= CallNextHookEx(hkQQChat, Code, wParam, lParam);
Exit;
end
else
if Code = HCBT_ACTIVATE then
begin
//获取激活窗口的句柄,以及窗口类名,然后判断此窗口类名是否为#32770。
hwQQChat:= HWND(wParam);
GetClassName(hwQQChat, buf, 1024);
clsName:= string(buf);
if clsName = csQQ then
begin
//如果窗口类名是#32770,则遍枚举所有窗口,并将窗口句柄传入
//【这里仅仅做演示用,因为Windows中很多窗口的类名均为#32770,所以这样判断效率会很底,】
//【有兴趣的朋友可以根据QQ聊天窗口的特性来增加判断条件,从而提高效率。】
EnumWindows(@EnumWindowsTitleFunc, hwQQChat);
end;
end;
end;function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall;
begin
if (Handle = lParam) and boolean(GetWindowText(Handle, buf, 256)) then
begin
//根据窗口句柄获得窗口标题
tlQQChat:= string(buf); //然后判断标题中是否包含"与...聊天"等相关字符,如果包括则此窗口为QQ聊天窗口
if (( pos ('等', tlQQChat)>0) and (pos('个会话', tlQQChat)>0)) then
begin
//确定为聊天窗口后遍修改窗口标题。
tlQQChat := AnsiReplaceStr(tlQQChat, '等', '我的文档');
tlQQChat := AnsiReplaceStr(tlQQChat, '个会话', '' );
SetWindowText(Handle, pchar(tlQQChat));
end;
//【同上,这个地方大家可以自由控制,不仅仅局限在QQ、MSN等聊天窗口。】
//【而且想要将标题改成什么也可以自由控制,如果能根据修改后的窗口图标来确定标题】
//【比如通过修改将窗口图标替换成Delphi的图标,然后标题修改为Delphi7,谁还能看出破绽呢?哈哈】
if ((pos('群 -', tlQQChat)>0) or (pos('高级群 -', tlQQChat)>0)) then
begin
tlQQChat := AnsiReplaceStr(tlQQChat, '群 -', '我的文档');
tlQQChat := AnsiReplaceStr(tlQQChat, '高级' , '' );
SetWindowText(Handle, pchar(tlQQChat));
end;
end;
Result :=True;
end;
function MouseHookProc(nCode: Integer;WParam: WPARAM;LParam:LPARAM): LRESULT;stdcall;
var
MouseHookStruct: ^TMOUSEHOOKSTRUCT;//这个结构Delphi在Windows单元有定义,直接用就可以了。
nState: SHORT;//得到键盘状态的GetKeyState函数的返回值。这是一个16位的数。
begin
Result := 0; //最好首先给它一个返回值,不然会有警告的!记住这可不是C语言。
//当nCode小于0时表示还有其它的Hook必须把参数传给它。
//此时就要用Api函数CallNextHookEx让它调用下一个Hook!!!当然不用好像也可以。
if nCode<0 then
Result := CallNextHookEx(hHk,nCode,WParam,LParam)//参数是现成的,直接用就可以了。 //详细的说明可以参考Win32 SDK
else
if wParam = WM_LBUTTONDBLCLK then //判断是不是鼠标左键双击事件
begin
nState := GetKeyState(VK_CONTROL);//这个函数只有一个参数,就是要得到的键的//键值,这里用Windows的虚拟键值表示ctrl键。
if (nState and $80000000) = $80000000 then//如果按下了,那么返回值的最高位为1
begin //即是16进制的80000000,如果没有按下就返回0
MouseHookStruct := Pointer(LParam); //转换指针并付值给MouseHookStruct变量。
SendMessage(MouseHookStruct.hwnd,WM_PASTE,0,0);//如果条件都满足了就发送WM_PASTE(粘贴)消息
end;
end;
end;//启动钩子
function EnableWheelHook: Boolean; stdcall; export;
begin
if hkQQChat=0 then
begin
hkQQChat := SetWindowsHookEx(WH_CBT, @TitleHookProc, Hinstance, 0);
Result := True;
end
else
Result := False;
end;//卸载钩子
function DisableWheelHook: Boolean; stdcall; export;
begin
if hkQQChat<>0 then
begin
UnHookWindowsHookEx(hkQQChat);
hkQQChat := 0;
Result := True;
end
else
Result := False;
end;在网上找的源码,我试过了,也不能控制最新版的QQ啦!
有没有谁做了改进,可以控制任何一个程序,只要传入进程名称就可以控制操作就最好!
请高手们帮帮忙啦!
谢谢!
不好意思,我用手机写的。。
比如想控制QQ进行聊天,先判断是否是某某Q友,是的话就自动输入"XXX”并且发送
我的意思是要能钩其他的软件,就Windows软件就可以啦,不要求去钩什么web之类的!