這幾天學習了一下鉤子的知識。
看的是孫鑫的視頻,孫鑫的視頻真的是經典。
但個人不認為他不是MFC的原理講解的好視頻。不過貌似現在也沒有講MFC原理很好的書。
主要是MFC 復雜性吧。
不過簡單把整體思想學習一下 臺灣的侯捷 確實強悍的一本書(主要是第三章模擬MFC 原理)
.
這個程序貌似貌似百度文庫有類似的程序,但試了一下貌似不可以。
如是我重寫了一下程序。
簡單寫了一下。
實現正確獲取對記事本的消息。--》如果你是不懂鉤子請看孫鑫的視頻。這篇文章不適合你。
這里程序是DLL 里的代碼
CMyNodeHook2.h
#ifndef CMYNODEHOOK2
#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>
HHOOK g_hOOk = NULL;
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;
}
void CMyNodeHook::UnHook()
{
if(isStart)
{
UnhookWindowsHookEx(g_hOOk);
isStart = FALSE;
MessageBox(0,"成功釋放鉤子",0,0);
}
else
{
MessageBox(0,"帥哥你還沒有放鉤子",0,0);
}
}
CMyNodeHook::~CMyNodeHook()
{
UnHook();
}
posted on 2012-04-23 23:52
小魚兒 閱讀(736)
評論(0) 編輯 收藏 引用