csdn大讨论, 关于win32 hook, 程序员都要来看!

rfa20 2001-03-05 08:49:00
请把你们的hook资料帖上来,如果在网上有下载,请注明地址。

请共享出你所知道的hook资料!

讨论:

hook都用在那些地方?作什么程序会用到hook。

...全文
1181 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
元明 2001-06-05
  • 打赏
  • 举报
回复
太好了,谢谢大家.
vcbear 2001-03-07
  • 打赏
  • 举报
回复
to FlyHeart:
WH_GETMESSAGE
handle the WM_KEYDOWN message
not KeyboardHook
cindy2000 2001-03-07
  • 打赏
  • 举报
回复
to flyheart: sure!
flyheart 2001-03-07
  • 打赏
  • 举报
回复
我想知道可不可用hook修改消息,比如,我用键盘钩子截获到用户按了字母键'a'
可不可以在钩子函数中改成字母'b'。
misterliwei 2001-03-07
  • 打赏
  • 举报
回复
是hook api 还是hook mouse 等。
我用delphi 编了一个keyboard hook 结果有时会出现 run error 216 at XXXX.
大虾们,知道什么原因吗?
wbc_58 2001-03-07
  • 打赏
  • 举报
回复
这些东西,属于小技巧。还是看看
cycsharp 2001-03-07
  • 打赏
  • 举报
回复
attention
realsweat 2001-03-07
  • 打赏
  • 举报
回复
关注
sxbyl 2001-03-07
  • 打赏
  • 举报
回复
http://sxbyl.home.chinaren.com
AntGhazi 2001-03-07
  • 打赏
  • 举报
回复
呵呵,试试手又有何妨,顺便也可学学DLL。“大讨论”却有点犯不着。

vcbear兄,你们那防火枪做得如何。请多多指教!
vcbear 2001-03-07
  • 打赏
  • 举报
回复
这种问题?
到cn.yahoo.net用关键字 “Hook编程”查询
或者在vc版用 ‘Hook’ 或'钩子' 查询,
绝对可以更快的获得资料。

Hook只不过是一种很平常的技术,是Ms用来打破进程边界,
监视User模块消息的一种勾当。犯不着“大讨论”。
NowCan 2001-03-07
  • 打赏
  • 举报
回复
键盘钩子
//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



NowCan 2001-03-07
  • 打赏
  • 举报
回复
键盘钩子
//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



angwan 2001-03-07
  • 打赏
  • 举报
回复
对不起,我言词激烈了些,我也菜,今天心情不好。对不起。
angwan 2001-03-07
  • 打赏
  • 举报
回复
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大讨论,真是井底之蛙,钩子这种初级话题....哎。

angwan 2001-03-07
  • 打赏
  • 举报
回复
hook好似dos下的TSR,拦截系统的中断调用,比如jBuilder中按鼠标右键出来的菜单中没有COPY等选项,我用hook,作了一个,很简单。
井底之蛙,csdn大讨论,我最讨厌用词不当,大家谦虚一点好不好。
rfa20 2001-03-07
  • 打赏
  • 举报
回复
有好的资料吗
tzp 2001-03-06
  • 打赏
  • 举报
回复
我这里有两个函数
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;
zzzling 2001-03-06
  • 打赏
  • 举报
回复
键盘HOOK怎么做的?
我同学作了一个,破了我的密码,气死我了
快教教我
rfa20 2001-03-06
  • 打赏
  • 举报
回复
关注
加载更多回复(12)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧