windows挂钩设立成功后没有执行回调函数
windows挂钩设置成功后没有执行回调函数
我遇到了一个问题,在照着《windows核心编程》里代码给桌面设置挂钩,挂钩设置成功后(getlasterror()没有错误,SetWindowsHookEx返回值也不是空),但是没有执行回调函数里的代码
这个是dll代码,mfc生成的其他代码就不贴了
这个是调用dll代码,设置lib什么的在项目属性里做了
------解决思路----------------------
用Process monitor等查看dll是否加载了,重启一下explore 呢
------解决思路----------------------
你的Windows8.1是64位的吗?如果是的话explorer.exe进程也是64位的
你的钩子DLL是32位,没办法勾住桌面进程
将钩子DLL改为64位编译可能可以,你试试吧
我遇到了一个问题,在照着《windows核心编程》里代码给桌面设置挂钩,挂钩设置成功后(getlasterror()没有错误,SetWindowsHookEx返回值也不是空),但是没有执行回调函数里的代码
这个是dll代码,mfc生成的其他代码就不贴了
#include "stdafx.h"
#include "TestBookDll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
DWORD g_dwThreadIdDIPS = 0;
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws")
//提前声明消息处理函数
LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam);
HINSTANCE g_hInstDll;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(NULL);
if (hModule != NULL)
{
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
g_hInstDll = hModule;
}
}
else
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: GetModuleHandle 失败\n"));
nRetCode = 1;
}
return nRetCode;
}
//设置钩子
BOOL WINAPI SetDIPSHook(DWORD dwThreadId) {
BOOL bOk = FALSE;
if (dwThreadId != 0) {
// Make sure that the hook is not already installed.
if (g_hhook == NULL){
bOk = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
//将设置钩子的线程id保存
g_dwThreadIdDIPS = GetCurrentThreadId();
g_hhook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll,
dwThreadId);
bOk = (g_hhook != NULL);
if (bOk) {
bOk = PostThreadMessage(dwThreadId, WM_NULL, 0, 0);
}
}
else {
if(g_hhook != NULL);
bOk = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
return(bOk);
}
///////////////////////////////////////////////////////////////////////////////
LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) {
static BOOL bFirstTime = TRUE;
if (bFirstTime) {
// The DLL just got injected.
bFirstTime = FALSE;
//给设置钩子的进程发送一个消息, 在那打印成功信息
PostThreadMessage(g_dwThreadIdDIPS, WM_NULL, 0, 333);
}
return(CallNextHookEx(g_hhook, nCode, wParam, lParam));
}
这个是调用dll代码,设置lib什么的在项目属性里做了
#include "stdafx.h"
#include "TestBook.h"
#include "../TestBookDll/TestBookDll.h"
// 全局变量:
HINSTANCE hInst; // 当前实例
INT_PTR CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void test();
void install();
void uninstall();
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;
hInst = hInstance;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_TESTBOOK), NULL, WndProc);
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDD_TESTBOOK));
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
// 处理对话框消息
INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDOK:
case IDCANCEL:
EndDialog(hWnd, LOWORD(wParam));
return (INT_PTR)TRUE;
case IDC_INSTALL:
//安装钩子
install();
break;
case IDC_UNINSTALL:
//卸载钩子
uninstall();
break;
default:
break;
}
break;
case WM_NULL:
//这里判断是否是从dll中发来的消息
if (lParam==333)
test();
default:
break;
}
return (INT_PTR)FALSE;
}
//打印成功信息
void test()
{
std::ofstream ofile("c:/log.txt");
ofile << "sucessful" << std::endl;
ofile.close();
}
HWND getListView()
{
//获取桌面listview hwnd
HWND mainWindow = ::FindWindow(_T("Progman"), NULL);
HWND defView = ::FindWindowEx(mainWindow, NULL, _T("SHELLDLL_DefView"), NULL);
return ::FindWindowEx(defView, NULL, _T("SysListView32"), NULL);
}
void install()
{
HWND hWndLV = getListView();
SetDIPSHook(GetWindowThreadProcessId(hWndLV, NULL));
}
void uninstall()
{
SetDIPSHook(0);
}
------解决思路----------------------
用Process monitor等查看dll是否加载了,重启一下explore 呢
------解决思路----------------------
你的Windows8.1是64位的吗?如果是的话explorer.exe进程也是64位的
你的钩子DLL是32位,没办法勾住桌面进程
将钩子DLL改为64位编译可能可以,你试试吧