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

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

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

讨论:

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

...全文
1215 32 打赏 收藏 转发到动态 举报
写回复
用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)
先展示下效果 https://pan.quark.cn/s/e81b877737c1 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 执行环境,它使开发者能够在服务器端执行 JavaScript 编程,显著促进了全栈开发的应用普及。 在 Node.js 的开发流程中,`node_modules` 文件夹用于存储所有依赖的模块,随着项目的进展,该文件夹可能会变得异常庞大,其中包含了众多可能已不再需要的文件和文件夹,这不仅会消耗大量的硬盘空间,还可能减慢项目的加载时间。 `ModClean 2.0` 正是为了应对这一挑战而设计的工具。 `ModClean` 是一款用于清理 `node_modules` 的软件,其核心功能是移除那些不再被使用的文件和文件夹,从而确保项目的整洁性和运行效率。 `ModClean 2.0` 是此工具的改进版本,在原有功能上增加了更多特性,从而提高了清理工作的效率和精确度。 在 `ModClean 2.0` 中,用户可以设置清理规则,例如排除特定的模块或文件类型,以防止误删重要文件。 该工具通常会保留项目所依赖的核心模块,但会移除测试、文档、示例代码等非运行时必需的部分。 通过这种方式,`ModClean` 能够协助开发者优化项目结构,减少不必要的依赖,加快项目的构建速度。 使用 `ModClean` 的步骤大致如下:1. 需要先安装 `ModClean`,在项目的根目录中执行以下命令: ``` npm install modclean -g ```2. 创建配置文件 `.modcleanrc.json` 或 `.modcleanrc.js`,设定希望清理的规则。 比如,可能需要忽略 `LICENSE` 文件或整个 `docs`...

16,551

社区成员

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

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

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