今天这个话题比较简单,仅截取同进程的窗体消息,如果我们再做一些处理做成一个DLL然后将DLL驻入到指定进程的窗体中那更有意思了, 我们将在后面的章节里再研究一下。 我们开始学习了。 本节与上一节都在讲述着同相的内容围绕着GetWindowLongPtr, SetWindowLongPtr两个API进行的
(一) 函数声明
LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex );
LONG_PTR SetWindowLongPtr(HWND hWnd, int nIndex, LONG_PTR dwNewLong );
获取/修改Window窗体信息值
Code1: 通过修改窗体过程函数来截取窗体消息
1. 为了保存原窗体过程函数, 我们将它到设置USER_DATA位,实现各函数数据共享;
2. 通过SetWindowLongPtr, 来设置新的窗体过程函数;
if (!bHook)
{
TCHAR szTmp[MAX_PATH];
TCHAR szClsName[MAX_PATH];
GetClassName(hWnd, szClsName, MAX_PATH);
WNDCLASSEX wcx = {0};
wcx.cbSize = sizeof(WNDCLASSEX);
SetWindowText(GetDlgItem(hWnd, ID_BTNHOOKMSG), _T("Stop Hook"));
OutputDebugString(_T("\n============== Start Hook Message ================\n"));
GetClassInfoEx(GetModuleHandle(NULL), szClsName, &wcx);
_stprintf_s(szTmp, _T("WndProc Value before SetWindowLongPtr: 0x%0X ==> 0x%0X\n"), wcx.lpfnWndProc, GetWindowLongPtr(hWnd, GWLP_WNDPROC));
OutputDebugString(szTmp);
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)WndProc);
SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG)_HookWndProc);
GetClassInfoEx(GetModuleHandle(NULL), szClsName, &wcx);
_stprintf_s(szTmp, _T("WndProc Value After SetWindowLongPtr: 0x%0X ==> 0x%0X\n"), wcx.lpfnWndProc, GetWindowLongPtr(hWnd, GWLP_WNDPROC));
OutputDebugString(szTmp);
OutputDebugString(_T("==================================================================\n"));
bHook = true;
} else {
SetWindowText(GetDlgItem(hWnd, ID_BTNHOOKMSG), _T("Start Hook"));
OutputDebugString(_T("\n============== Stop Hook Message ================\n"));
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)0);
SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG)WndProc);
bHook = false;
}