求教c++钩子问题

u010378582 2017-04-11 09:56:04
我最近编写一个钩取系统消息的程序。结果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);
...全文
99 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010378582 2017-04-11
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 以XP兼容模式运行 ……
恩。问题解决了。谢谢。
赵4老师 2017-04-11
  • 打赏
  • 举报
回复
关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 以XP兼容模式运行 ……
u010378582 2017-04-11
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
坊间传闻,需要放在dll中。
我这就是将回调函数放入dll中,然后在主程序中调用dll中的回调函数的。
赵4老师 2017-04-11
  • 打赏
  • 举报
回复
坊间传闻,需要放在dll中。
u010378582 2017-04-11
  • 打赏
  • 举报
回复
求助,没有人吗??

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧