学习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