创建WH_MOUE全局钩子,可以正常的生成DLL
在程序中加载,启动程序却没有任何响应,为什么呢?
各位帮忙啊!
dll中代码如下:
//Mousehook.h
#ifndef _MOUSEHOOK_H
#define _MOUSEHOOK_H
class AFX_EXT_CLASS CMouseHook: public CObject
{
public:
CMouseHook();
~CMouseHook();
//Install Hook
BOOL StartHook(HWND hWnd);
//Release Hook
BOOL StopHook();
protected:
private:
};
#endif
// MouseHook.cpp : Defines the initialization routines for the DLL.
//#include "stdafx.h"
#include <afxdllx.h>
#include "Mousehook.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif#pragma data_seg("Share")
HWND glhPrevTarWnd = NULL;
HWND glhDisplayWnd = NULL;
HHOOK glhHook = NULL;
HINSTANCE glhInstance = NULL;
#pragma data_seg() #pragma comment(linker, "/SECTION:Share,RWS")
static AFX_EXTENSION_MODULE MouseHookDLL = { NULL, NULL };
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam); int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("MOUSEHOOK.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(MouseHookDLL, hInstance))
return 0; // Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result. new CDynLinkLibrary(MouseHookDLL);
glhInstance = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("MOUSEHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(MouseHookDLL);
}
return 1; // ok
}CMouseHook::CMouseHook()
{
}CMouseHook::~CMouseHook()
{
StopHook();
}BOOL CMouseHook::StartHook(HWND hWnd)
{
BOOL bResult = FALSE;
glhDisplayWnd = hWnd;
glhHook = SetWindowsHookEx(WH_MOUSE, MouseProc, glhInstance, 0);
if(glhHook!=NULL)
bResult = TRUE;
glhDisplayWnd = hWnd;
return bResult;
}BOOL CMouseHook::StopHook()
{
BOOL bResult = FALSE;
if(glhHook)
{
bResult = UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhHook = NULL;
glhPrevTarWnd = NULL;
glhDisplayWnd = NULL;
}
}
return bResult;
}LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam)
{
LPMOUSEHOOKSTRUCT lpMouseHook = (LPMOUSEHOOKSTRUCT)lParam;
if(code >= 0)
{
HWND glhTargetWnd = lpMouseHook->hwnd;
HWND ParentWnd = glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd = ParentWnd;
ParentWnd = GetParent(glhTargetWnd);
}
if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[100];
GetWindowText(glhTargetWnd, szCaption, 100);
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd;
}
}
return CallNextHookEx(glhHook, code, wParam, lParam);
}
在程序中加载,启动程序却没有任何响应,为什么呢?
各位帮忙啊!
dll中代码如下:
//Mousehook.h
#ifndef _MOUSEHOOK_H
#define _MOUSEHOOK_H
class AFX_EXT_CLASS CMouseHook: public CObject
{
public:
CMouseHook();
~CMouseHook();
//Install Hook
BOOL StartHook(HWND hWnd);
//Release Hook
BOOL StopHook();
protected:
private:
};
#endif
// MouseHook.cpp : Defines the initialization routines for the DLL.
//#include "stdafx.h"
#include <afxdllx.h>
#include "Mousehook.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif#pragma data_seg("Share")
HWND glhPrevTarWnd = NULL;
HWND glhDisplayWnd = NULL;
HHOOK glhHook = NULL;
HINSTANCE glhInstance = NULL;
#pragma data_seg() #pragma comment(linker, "/SECTION:Share,RWS")
static AFX_EXTENSION_MODULE MouseHookDLL = { NULL, NULL };
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam); int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("MOUSEHOOK.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(MouseHookDLL, hInstance))
return 0; // Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result. new CDynLinkLibrary(MouseHookDLL);
glhInstance = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("MOUSEHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(MouseHookDLL);
}
return 1; // ok
}CMouseHook::CMouseHook()
{
}CMouseHook::~CMouseHook()
{
StopHook();
}BOOL CMouseHook::StartHook(HWND hWnd)
{
BOOL bResult = FALSE;
glhDisplayWnd = hWnd;
glhHook = SetWindowsHookEx(WH_MOUSE, MouseProc, glhInstance, 0);
if(glhHook!=NULL)
bResult = TRUE;
glhDisplayWnd = hWnd;
return bResult;
}BOOL CMouseHook::StopHook()
{
BOOL bResult = FALSE;
if(glhHook)
{
bResult = UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhHook = NULL;
glhPrevTarWnd = NULL;
glhDisplayWnd = NULL;
}
}
return bResult;
}LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam)
{
LPMOUSEHOOKSTRUCT lpMouseHook = (LPMOUSEHOOKSTRUCT)lParam;
if(code >= 0)
{
HWND glhTargetWnd = lpMouseHook->hwnd;
HWND ParentWnd = glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd = ParentWnd;
ParentWnd = GetParent(glhTargetWnd);
}
if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[100];
GetWindowText(glhTargetWnd, szCaption, 100);
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd;
}
}
return CallNextHookEx(glhHook, code, wParam, lParam);
}
解决方案 »
- 关于WaitCommEvent 的一个问题
- 怎么为ActiveX添加一个属性,并且属性返回的类型为另外一个接口
- 有趣的问题,界面假死***********************
- 关于将滑动条设置两个滑块的功能!
- 急!一个控件的源代码解读,需要各位帮忙!!
- 请教MFC高手:CObList为什么插入时会修改指针?急!100分求
- winmain问题(初学者求助)
- 100 分 求救!为什么使用VFW播放USB接入的视频流正常,但使用1394接入的视频却不能显示图象,
- C++串口控件MSComm不能发送回车符的问题
- 关于MFC一个很菜的问题,期待高手解决
- 使用ado打开数据库时数据为什么不会动态更新啊?
- 关于matlab 生成COM组件的问题,如何才能使用工具箱函数,比如神经网络工具箱?
CWnd * pwnd = GetDlgItem(IDC_EDIT1);
m_hook.StartHook(pwnd->GetSafeHandle());可是运行没有响应,我把m_hook成员变量删除,就是一个简单基于对话框的mfc程序,可以运行,是不是问题出在dll上,还有就是DLL中如何调试呢?
谢谢了!