钩子钩记事本
这几天学习了一下钩子的知识。
看的是孙鑫的视频,孙鑫的视频真的是经典。
但个人不认为他不是MFC的原理讲解的好视频。不过貌似现在也没有讲MFC原理很好的书。
主要是MFC 复杂性吧。
不过简单把整体思想学习一下 台湾的侯捷 确实强悍的一本书(主要是第三章模拟MFC 原理)
.
这个程序貌似貌似百度文库有类似的程序,但试了一下貌似不可以。
如是我重写了一下程序。
简单写了一下。
实现正确获取对记事本的消息。--》如果你是不懂钩子请看孙鑫的视频。这篇文章不适合你。
这里程序是DLL 里的代码
CMyNodeHook2.h
#ifndef CMYNODEHOOK2
#define CMYNODEHOOK2 _declspec(dllimport)
#endif
#define CMYNODEHOOK2 _declspec(dllimport)
#endif
//这里我们用类
class CMYNODEHOOK2 CMyNodeHook
{
public:
void SetHook();
void UnHook();
~CMyNodeHook();
};
CMyNodeHook2.cpp
#define CMYNODEHOOK2 _declspec(dllexport)
#include "CMyNodeHook2.h"
//#include <windows.h>
#include <stdio.h>
#include <AFXWIN.H> //这里我添加了MFC DLL 的 你可以不是用CString 和 AFxMessageBox();改用原始 API
#include <AFX.H> //即可
//#include <afxwin.h>
#include "CMyNodeHook2.h"
//#include <windows.h>
#include <stdio.h>
#include <AFXWIN.H> //这里我添加了MFC DLL 的 你可以不是用CString 和 AFxMessageBox();改用原始 API
#include <AFX.H> //即可
//#include <afxwin.h>
HHOOK g_hOOk = NULL;
BOOL isStart = NULL;
HINSTANCE g_hInst = FALSE; //全局函数
int flag =1;
BOOL isStart = NULL;
HINSTANCE g_hInst = FALSE; //全局函数
int flag =1;
LRESULT CALLBACK GetMsgProc(
int nCode, // hook code
WPARAM wParam, // removal option
LPARAM lParam // message
)
{
//函数名字可以改 但必须是这种格式化
//我们看msdn 知道lparam是一个指针 指向CWPSTRUCT结构的指针
//所以我们可以
MSG *lpMsg;
lpMsg = (MSG *)lParam;
TCHAR szClass[256];
memset(szClass,0,256);
GetClassName(lpMsg->hwnd,szClass,255);
if(0 == strcmp(szClass,"Edit")) //先判断是否是否为CEidt窗口类
{
//MessageBox(0,szClass,0,0);
HWND hWnd = GetParent(lpMsg->hwnd);
GetClassName(hWnd,szClass,256);
if(0==strcmp(szClass,"Notepad")) //再来判断是否为Notepad窗口类
{//这样大概就可以判断为记事本了
if(lpMsg->message == WM_CHAR ) //判断是否按下键
{
CString s;
s.Format("你按的键是 %c",lpMsg->wParam);//这里你只是对一个按键消息,要对组合键 就要对lparam进行操作
//具体可以参考MSDN
AfxMessageBox(s);
return 1; //貌似GetMsgProc不能过滤掉消息,可能是自己才学 没有学到吧。。测试了一下没有成功
}
else
return CallNextHookEx(g_hOOk,nCode,wParam,lParam);
}
else
return CallNextHookEx(g_hOOk,nCode,wParam,lParam);
}
else
return CallNextHookEx(g_hOOk,nCode,wParam,lParam);
}
void CMyNodeHook::SetHook()
{
g_hInst = GetModuleHandle("CMyNodeHook2");
g_hOOk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,g_hInst,0);//使用这种方法获取 模块句柄
if(NULL == g_hOOk)
{
MessageBox(0,"创建钩子失败",0,0);
exit(1);
}
isStart = TRUE;
}
{
g_hInst = GetModuleHandle("CMyNodeHook2");
g_hOOk = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,g_hInst,0);//使用这种方法获取 模块句柄
if(NULL == g_hOOk)
{
MessageBox(0,"创建钩子失败",0,0);
exit(1);
}
isStart = TRUE;
}
void CMyNodeHook::UnHook()
{
if(isStart)
{
UnhookWindowsHookEx(g_hOOk);
isStart = FALSE;
MessageBox(0,"成功释放钩子",0,0);
}
else
{
MessageBox(0,"帅哥你还没有放钩子",0,0);
}
}
{
if(isStart)
{
UnhookWindowsHookEx(g_hOOk);
isStart = FALSE;
MessageBox(0,"成功释放钩子",0,0);
}
else
{
MessageBox(0,"帅哥你还没有放钩子",0,0);
}
}
CMyNodeHook::~CMyNodeHook()
{
UnHook();
}
{
UnHook();
}