csdn大讨论, 关于win32 hook, 程序员都要来看!
请把你们的hook资料帖上来,如果在网上有下载,请注明地址。
请共享出你所知道的hook资料!
讨论:
hook都用在那些地方?作什么程序会用到hook。
问题点数:120、回复次数:32Top
1 楼NowCan(城市浪人)回复于 2001-03-05 20:54:00 得分 10
SPY++就用了HookTop
2 楼NowCan(城市浪人)回复于 2001-03-05 20:59:00 得分 10
还有金山词霸,屏幕取词。Top
3 楼NowCan(城市浪人)回复于 2001-03-05 21:01:00 得分 10
还有,如果你想改变其他窗口的窗口过程。。。。Top
4 楼rfa20()回复于 2001-03-05 21:02:00 得分 0
有什么好的文章可以贴出来Top
5 楼yemagxy(把酒言欢)回复于 2001-03-05 21:04:00 得分 0
关注Top
6 楼micrack(道歉中。。。)回复于 2001-03-05 21:12:00 得分 0
关注,极度地Top
7 楼youyou()回复于 2001-03-05 21:26:00 得分 0
太及时了,这几天正想学HOOK,找不到资料,
MSDN的那篇文章怎么也读不明白。
请有经验的大虾多多赐教,
如果需要,我出100分,谢谢。Top
8 楼micrack(道歉中。。。)回复于 2001-03-05 21:30:00 得分 0
等我有时间,写篇文章贴在这Top
9 楼colossus(^_^)回复于 2001-03-05 22:10:00 得分 0
其实Hook有很多种,我做了鼠标和键盘的Hook,可以截获鼠标和键盘消息.Top
10 楼wyzegg(蛋)回复于 2001-03-05 22:19:00 得分 0
Hook 很有意思吗Top
11 楼piaoyun()回复于 2001-03-05 22:55:00 得分 10
凡是要改变或要截取消息大都需要用到HOOK,是我们修改和完善WINDOWS的好东东。Top
12 楼feiyunge(飞奔的蜗牛)回复于 2001-03-05 23:07:00 得分 0
我也想知道
哪位大侠知道贴出来瞧瞧
:(_Top
13 楼rfa20()回复于 2001-03-06 18:06:00 得分 0
关注Top
14 楼zzzling(zzzling)回复于 2001-03-06 21:12:00 得分 0
键盘HOOK怎么做的?
我同学作了一个,破了我的密码,气死我了
快教教我Top
15 楼tzp(tangzhupeng)回复于 2001-03-06 21:58:00 得分 20
我这里有两个函数
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;
//侦测CTRL+B组合键
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;
//持上键盘类型的HOOK,同时传回值必须保锱下来
//防止呼叫中断
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookHandler,
HInstance,
0);
Result := hNextHookProc <> 0;
end;
Top
16 楼rfa20()回复于 2001-03-07 01:06:00 得分 0
有好的资料吗Top
17 楼vcbear(http://vcbear.mblogger.cn)回复于 2001-03-07 09:05:00 得分 30
这种问题?
到cn.yahoo.net用关键字 “Hook编程”查询
或者在vc版用 ‘Hook’ 或'钩子' 查询,
绝对可以更快的获得资料。
Hook只不过是一种很平常的技术,是Ms用来打破进程边界,
监视User模块消息的一种勾当。犯不着“大讨论”。Top
18 楼AntGhazi(蚂蚁勇士)回复于 2001-03-07 09:24:00 得分 0
呵呵,试试手又有何妨,顺便也可学学DLL。“大讨论”却有点犯不着。
vcbear兄,你们那防火枪做得如何。请多多指教!Top
19 楼sxbyl(sxbyl)回复于 2001-03-07 09:35:00 得分 0
http://sxbyl.home.chinaren.comTop
20 楼realsweat(汗水)回复于 2001-03-07 09:49:00 得分 0
关注Top
21 楼cycsharp(cycsharp)回复于 2001-03-07 09:58:00 得分 0
attentionTop
22 楼wbc_58(将进酒)回复于 2001-03-07 11:33:00 得分 0
这些东西,属于小技巧。还是看看Top
23 楼misterliwei()回复于 2001-03-07 11:37:00 得分 0
是hook api 还是hook mouse 等。
我用delphi 编了一个keyboard hook 结果有时会出现 run error 216 at XXXX.
大虾们,知道什么原因吗?Top
24 楼flyheart(飞扬的心)回复于 2001-03-07 12:31:00 得分 0
我想知道可不可用hook修改消息,比如,我用键盘钩子截获到用户按了字母键'a'
可不可以在钩子函数中改成字母'b'。
Top
25 楼cindy2000()回复于 2001-03-07 12:40:00 得分 0
to flyheart: sure!Top
26 楼vcbear(http://vcbear.mblogger.cn)回复于 2001-03-07 12:59:00 得分 0
to FlyHeart:
WH_GETMESSAGE
handle the WM_KEYDOWN message
not KeyboardHookTop
27 楼angwan(mofu)回复于 2001-03-07 13:21:00 得分 10
hook好似dos下的TSR,拦截系统的中断调用,比如jBuilder中按鼠标右键出来的菜单中没有COPY等选项,我用hook,作了一个,很简单。
井底之蛙,csdn大讨论,我最讨厌用词不当,大家谦虚一点好不好。Top
28 楼angwan(mofu)回复于 2001-03-07 17:41:00 得分 0
to flyheart(飞扬的心):可以,你此时可以用如下:
SendMessage(hwnd,WM_CHAR ,(TCHAR)'b' ,(LPARAM)1);
或者:
keybd_event('B',0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event('B',0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
//有的情况下不可以如此。
这帮厮菜鸟一群,还大言不惭csdn大讨论,真是井底之蛙,钩子这种初级话题....哎。
Top
29 楼angwan(mofu)回复于 2001-03-07 17:44:00 得分 0
对不起,我言词激烈了些,我也菜,今天心情不好。对不起。Top
30 楼NowCan(城市浪人)回复于 2001-03-07 20:02:00 得分 20
键盘钩子
//hook.c
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
HINSTANCE g_hinstDll = NULL;
#pragma data_seg(".drectve")
static char szLinkDirectiveShared[] = "-section:Shared,rws";
#pragma data_seg()
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
HWND g_hwndPost = NULL;
UINT g_uMsgNotify = WM_USER;
#pragma data_seg()
static LRESULT WINAPI KeyboardHook_HookProc (
int nCode,
WPARAM wParam,
LPARAM lParam)
{
LRESULT lResult = CallNextHookEx(g_hhook, nCode, wParam, lParam);
if (nCode == HC_ACTION)
{
PostMessage(g_hwndPost, g_uMsgNotify, wParam, lParam);
}
return(lResult);
}
BOOL WINAPI SetKeyboardHook (HWND hWndPost, UINT Msg)
{
HHOOK hhook;
if (g_hhook != NULL) return(FALSE);
g_hwndPost = hWndPost;
g_uMsgNotify = Msg;
Sleep(0);
hhook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHook_HookProc, g_hinstDll, 0);
InterlockedExchange((PLONG) &g_hhook, (LONG) hhook);
return(g_hhook != NULL);
}
BOOL WINAPI ReleaseKeyboardHook()
{
BOOL fOK = TRUE;
if (g_hhook != NULL)
{
fOK = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
return(fOK);
}
BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
g_hinstDll = hinstDll;
break;
}
return(TRUE);
}
//hook.bas
Attribute VB_Name = "Module1"
Option Explicit
Public Const GWL_WNDPROC = (-4)
Public Const WM_USER = &H400
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function SetKeyboardHook Lib "KeybHook" (ByVal hwndPost As Long, ByVal Msg As Long) As Long
Declare Function ReleaseKeyboardHook Lib "KeybHook" () As Long
Public prevWndProc As Long
Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_USER Then
Form1.List1.AddItem "wParam=" & wParam & ", lParam=" & Hex(lParam)
Form1.List1.ListIndex = Form1.List1.NewIndex
End If
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Function
//kbtrace.frm
Private Sub Form_Load()
On Error Resume Next
SetKeyboardHook Me.hWnd, WM_USER
If Err.Number <> 0 Then
MsgBox "请先将 KeybHook.dll 复制到 Windows 的所在路径!", vbCritical
End
End If
On Error GoTo 0
prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
End Sub
Private Sub Form_Unload(Cancel As Integer)
ReleaseKeyboardHook
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
End Sub
Top
31 楼NowCan(城市浪人)回复于 2001-03-07 20:03:00 得分 0
键盘钩子
//hook.c
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
HINSTANCE g_hinstDll = NULL;
#pragma data_seg(".drectve")
static char szLinkDirectiveShared[] = "-section:Shared,rws";
#pragma data_seg()
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
HWND g_hwndPost = NULL;
UINT g_uMsgNotify = WM_USER;
#pragma data_seg()
static LRESULT WINAPI KeyboardHook_HookProc (
int nCode,
WPARAM wParam,
LPARAM lParam)
{
LRESULT lResult = CallNextHookEx(g_hhook, nCode, wParam, lParam);
if (nCode == HC_ACTION)
{
PostMessage(g_hwndPost, g_uMsgNotify, wParam, lParam);
}
return(lResult);
}
BOOL WINAPI SetKeyboardHook (HWND hWndPost, UINT Msg)
{
HHOOK hhook;
if (g_hhook != NULL) return(FALSE);
g_hwndPost = hWndPost;
g_uMsgNotify = Msg;
Sleep(0);
hhook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHook_HookProc, g_hinstDll, 0);
InterlockedExchange((PLONG) &g_hhook, (LONG) hhook);
return(g_hhook != NULL);
}
BOOL WINAPI ReleaseKeyboardHook()
{
BOOL fOK = TRUE;
if (g_hhook != NULL)
{
fOK = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
return(fOK);
}
BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
g_hinstDll = hinstDll;
break;
}
return(TRUE);
}
//hook.bas
Attribute VB_Name = "Module1"
Option Explicit
Public Const GWL_WNDPROC = (-4)
Public Const WM_USER = &H400
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function SetKeyboardHook Lib "KeybHook" (ByVal hwndPost As Long, ByVal Msg As Long) As Long
Declare Function ReleaseKeyboardHook Lib "KeybHook" () As Long
Public prevWndProc As Long
Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_USER Then
Form1.List1.AddItem "wParam=" & wParam & ", lParam=" & Hex(lParam)
Form1.List1.ListIndex = Form1.List1.NewIndex
End If
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Function
//kbtrace.frm
Private Sub Form_Load()
On Error Resume Next
SetKeyboardHook Me.hWnd, WM_USER
If Err.Number <> 0 Then
MsgBox "请先将 KeybHook.dll 复制到 Windows 的所在路径!", vbCritical
End
End If
On Error GoTo 0
prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
End Sub
Private Sub Form_Unload(Cancel As Integer)
ReleaseKeyboardHook
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
End Sub
Top
32 楼magicwizard(巫师)回复于 2001-06-05 19:29:00 得分 0
太好了,谢谢大家.Top




