最近看windows钩子,但是自己按照别人的帖子写,总是不成功,求助各位大佬,看看是为什么。
使用的是VS 2017,系统环境是WIN10
//plugin.dll中的部分代码
LRESULT CALLBACK KeyBoardProc(int code, WPARAM wParam, LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if ((wParam == VK_HOME) && (lParam&(1 << 31)) == 0)
{
MessageBox(NULL, L"alert", L"你好,test", MB_OKCANCEL);
if (dlgForm == NULL) {
dlgForm = new CPwin;
dlgForm->Create(IDD_DLG_MAIN);
}
dlgForm->ShowWindow(SW_SHOW);
}
return CallNextHookEx(0, code, wParam, lParam);
}
HHOOK __stdcall SetKeyBoardHook(DWORD dwThreadId)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HMODULE hPlugin = GetModuleHandle(L"plugin.dll");//项目生成的是plugin.dll
//可以跟踪到这里,hPlugin指针正常
//返回钩子指针一直是NULL
KeyBoardHookId = SetWindowsHookEx(WH_KEYBOARD, &KeyBoardProc, hPlugin, dwThreadId);
//获取到错误为87
DWORD re = GetLastError();
return KeyBoardHookId;
}
//主程序代码相关代码
using namespace std;
list<HWND> m_hwndFind = list<HWND>();
map<HWND, HHOOK> m_hwndHooked = map<HWND, HHOOK>();
void CHookTestDlg::OnBnClickedBtnStart()
{
// TODO: 在此添加控件通知处理程序代码
m_hwndFind.clear();
list<HWND>().swap(m_hwndFind);
EnumWindows(CHookTestDlg::EnumWindowsProc, NULL);
list<HWND>::iterator itor;
for (itor = m_hwndFind.begin(); itor != m_hwndFind.end(); itor++) {
if (m_hwndHooked.count(*itor) == 0) {
char cTitle[129] = { 0 };
GetWindowTextA(*itor, cTitle, 128);
//GetClassNameA(*itor, cTitle, 128);
if (strcmp(cTitle, "计算器") == 0) {
DWORD dwProcId;
GetWindowThreadProcessId(*itor, &dwProcId);
HHOOK hook = (HHOOK)SetKeyBoardHook(dwProcId);
m_hwndHooked[*itor] = hook;
}
}
}
}
BOOL CHookTestDlg::EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
if (::GetWindowLong(hWnd, GWL_STYLE)&WS_VISIBLE)
{
m_hwndFind.push_back(hWnd);
EnumChildWindows(hWnd, CHookTestDlg::EnumWindowsProc, NULL);
}
return TRUE;
}