先问下这里怎么不用buttonclicked另外if(SetHook(TRUE, dlg.m_dwThreadId, m_hWnd))
{
m_bOpen = TRUE;
m_bPause = FALSE;
}
这个是dll中的 SetHook 吗?如果不是,那为什么不直接用dll中的呢BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
// 按钮的单击事件
ON_BN_CLICKED(IDC_TARGET, OnTarget)
ON_BN_CLICKED(IDC_PAUSE, OnPause)
ON_BN_CLICKED(IDC_CLEAR, OnClear)
ON_BN_CLICKED(IDC_TOPMOST, OnTopMost)
ON_BN_CLICKED(IDC_CLOSE, OnClose)
// 列表视图的单击和删除事件
ON_NOTIFY(NM_CLICK, IDC_LISTDATA, OnClickListData)
ON_NOTIFY(LVN_DELETEITEM, IDC_LISTDATA, OnDeleteItemList)  
// 两个自定义消息
ON_MESSAGE(HM_RECEIVE, OnReceive)
ON_MESSAGE(HM_SEND, OnSend)
END_MESSAGE_MAP()
void CMainDialog::OnTarget()
{
CEnumProcessDlg dlg(this);
// 弹出选择进程对话框
if(dlg.DoModal() == IDOK)
{
// 如果为其它进程安装了钩子,先卸载
if(m_bOpen)
{
SetHook(FALSE);
InitData();
}
// 为用户选择进程的主线程安装钩子
if(SetHook(TRUE, dlg.m_dwThreadId, m_hWnd))
{
m_bOpen = TRUE;
m_bPause = FALSE;
}
else
{
MessageBox(" 安装钩子出错!");
}
}
// 更新用户界面
UIControl();
}
BOOL SetHook(BOOL bInstall, DWORD dwThreadId = 0, HWND hWndCaller = NULL)
{
// 定义导出函数的类型
typedef (WINAPI *PFNSETHOOK)(BOOL, DWORD, HWND);
// 导出函数的DLL文件名。调试时可设置为../10IPPackLib/debug/10IPPackLib.dll
char szDll[] = "10IPPackLib.dll"; // 加载DLL模块
BOOL bNeedFree = FALSE;
HMODULE hModule = ::GetModuleHandle(szDll);
if(hModule == NULL)
{
hModule = ::LoadLibrary(szDll);
bNeedFree = TRUE;
} // 获取SetHook函数的地址
PFNSETHOOK mSetHook = (PFNSETHOOK)::GetProcAddress(hModule, "SetHook");
if(mSetHook == NULL) // 文件不正确?
{
if(bNeedFree)
::FreeLibrary(hModule);
return FALSE;
} // 调用SetHook函数
BOOL bRet = mSetHook(bInstall, dwThreadId, hWndCaller); // 如果卸载,释放上面加载的模块
if(!bInstall)
::FreeLibrary(hModule); return bRet;
}