求教c++钩子问题
我最近编写一个钩取系统消息的程序。结果SetWindowsHookEx(WH_MOUSE, MouseProc, glhInstance, 0);返回结果非零正常。但是回调函数却得不到消息。这是为何。
以下是程序源码:
主程序:
#include <stdio.h>
#include <windows.h>
#include "playDLL.h"
int g_int = 0;
HWND glhHook = NULL; // 鼠标钩子句柄
HINSTANCE glhInstance = NULL; // DLL实例句柄
BOOL CallChangeWindowMessageFilter(HWND hWnd, UINT nMsg, DWORD dwAction, PCHANGEFILTERSTRUCT chfit)
{
typedef BOOL(WINAPI *LPFUNC)(HWND, UINT, DWORD, PCHANGEFILTERSTRUCT);
HMODULE hLib = LoadLibraryA("user32.dll");
if (hLib)
{
LPFUNC func = (LPFUNC)GetProcAddress(hLib, "ChangeWindowMessageFilterEx");
if (func && chfit)
return func(hWnd, nMsg, dwAction, chfit);
}
return FALSE;
}
int main()
{
glhInstance = GetModuleHandle(L"MFCpingmuDLL.dll");
CHANGEFILTERSTRUCT chfit = { sizeof(CHANGEFILTERSTRUCT) };
CallChangeWindowMessageFilter(glhHook, WM_COPYDATA, MSGFLT_ALLOW, &chfit);
//glhHook = SetWindowsHookExW(WH_CBT, MouseProc, hDLL, 0);
glhHook = (HWND)SetWindowsHookEx(WH_MOUSE, MouseProc, glhInstance, 0);
int a = 0;a = GetLastError();
// Display();
for (;;){}
return 0;
}
dll为:
#include "stdafx.h"
#include"playDLL.h"
int g_int = 0;
HWND glhHook = NULL; // 鼠标钩子句柄
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT FAR *) lParam;
g_int++;
switch (g_int)
{
case 1:
SendMessage(FindWindow(0, 0), WM_SYSCOMMAND, SC_MONITORPOWER, 2);
//关闭显示器 根据MSDN,这个参数如果是1,则 表示显示器处于低能耗状态。
case 2:
SendMessage(FindWindow(0, 0), WM_SYSCOMMAND, SC_MONITORPOWER, -1); //打开显示器
case 3:
UnhookWindowsHookEx((HHOOK)glhHook);
}
//继续传递消息
return CallNextHookEx((HHOOK)glhHook, nCode, wParam, lParam);
}
dll的.h定义为:
#pragma once
#include <stdio.h>
#include <windows.h>
using namespace std;
extern "C" __declspec(dllexport) LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);