user Hook学习日志,文档备份

学习Hook时做的一个小东西,放在这里备份。

头文件.h

// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 USERX_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // USERX_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #pragma once #ifdef SHELLHKLIBAPI #define SHELLHKLIBAPI __declspec(dllexport) #else #define SHELLHKLIBAPI __declspec(dllimport) #endif #define WM_CREATEWINDOW WM_APP + 100//新建窗口时发送的消息 #define WM_DESTROYWINDOW WM_APP + 101//销毁窗口时发送的消息 #define WM_REDAWWINDOW WM_APP + 102 //窗口标题发生变化 extern "C" _declspec(dllexport) BOOL WINAPI HookShell_Start (HWND hwnd); extern "C" _declspec(dllexport) BOOL WINAPI HookShell_Stop (); extern "C" _declspec(dllexport) BOOL WINAPI HookCBT_Stop(); extern "C" _declspec(dllexport) BOOL WINAPI HookCBT_Start ();


.cpp实现文件// UserX.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include "UserX.h" //#include <map> #pragma warning(disable: 4001) /* Single line comment */ HINSTANCE g_hinstDll = NULL; // #pragma comment(linker,"-section:Shared,rws") #pragma data_seg("Shared") HHOOK g_hhook = NULL; // shell hook HHOOK g_hCBT = NULL; //CBT hook HWND g_hwndMain = NULL; // 主窗口 //HMap g_hwndMap; #pragma data_seg() BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: g_hinstDll = hinstDll; break; } return(TRUE); } // // DLL入门函数 // static LRESULT WINAPI HookShell_HookProc (int nCode, WPARAM wParam, LPARAM lParam) { HWND hwnd = (HWND) wParam; LRESULT lResult = CallNextHookEx(g_hhook, nCode, wParam, lParam); switch (nCode) { case HSHELL_WINDOWCREATED: { PostMessage(g_hwndMain,WM_CREATEWINDOW,wParam,lParam); } return(lResult); case HSHELL_WINDOWDESTROYED: PostMessage(g_hwndMain,WM_DESTROYWINDOW,wParam,lParam); return(lResult); //case HSHELL_WINDOWACTIVATED: case HSHELL_REDRAW: PostMessage(g_hwndMain,WM_REDAWWINDOW,wParam,lParam); return(lResult); default: return(lResult); } return(lResult); } // // WH_SHELL,新建顶层窗口 / BOOL WINAPI HookShell_Start (HWND hwnd) { HHOOK hhook = NULL; if (g_hhook != NULL) return(FALSE); g_hwndMain = hwnd; Sleep(0); hhook = SetWindowsHookEx(WH_SHELL, HookShell_HookProc, g_hinstDll, 0); InterlockedExchange((PLONG) &g_hhook, (LONG) hhook); return(g_hhook != NULL); } BOOL WINAPI HookShell_Stop() { BOOL fOK = TRUE; if (g_hhook != NULL) { fOK = UnhookWindowsHookEx(g_hhook); g_hhook = NULL; } return(fOK); } // // LRESULT CALLBACK CBT_Proc(int nCode, WPARAM wParam, LPARAM lParam ) { //防止桌面窗口被激活 if (nCode ==HCBT_ACTIVATE && (HWND)wParam ==g_hwndMain) { return 1; } return 0 ; } BOOL WINAPI HookCBT_Start () { HHOOK hhook = NULL; if (g_hCBT != NULL) return(FALSE); hhook = SetWindowsHookEx(WH_CBT, CBT_Proc, g_hinstDll, 0); InterlockedExchange((PLONG) &g_hCBT, (LONG) hhook); return(g_hCBT != NULL); } BOOL WINAPI HookCBT_Stop() { BOOL fOK = TRUE; if (g_hCBT != NULL) { fOK = UnhookWindowsHookEx(g_hCBT); g_hCBT = NULL; } return(fOK); }


.def 函数导出文件

LIBRARY "UserX" EXPORTS HookShell_Start HookShell_Stop HookCBT_Stop HookCBT_Start


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值