下面的这个小程序是在网上看见的,在学习使用后发现,当把数据段mydata的共享属性(“SECTIONS mydata READ WRITE SHARED”)取消后,鼠标钩子就不起作用了(抓不到鼠标的消息了)。请问一下:这是什么原因造成的?
一般情况下,DLL是数据段为个个进程私有,而代码段为所有进程公有。在下面这个小程序中,我想是可以不使用数据段共享的!
希望,有这方面经验的朋友,给予指点!谢谢!// MouseHook.cpp : Defines the initialization routines for the DLL.
//#include "stdafx.h"
#include <afxdllx.h>
#include "MouseHook.h"#pragma data_seg("mydata")
HINSTANCE glhInstance = NULL; // DLL实例句柄
HHOOK glhHook = NULL; // 安装的鼠标勾子句柄
HWND glhPrevTarWnd = NULL; // 上次鼠标所指的窗口句柄
HWND glhDisplayWnd = NULL; // 显示目标窗口标题编辑框的句柄
#pragma data_seg()#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE MouseHookDLL = { NULL, NULL };extern "C" 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; // 插入保存DLL实例句柄 }
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("MOUSEHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(MouseHookDLL);
}
return 1; // ok
}////////////////////////////////////////////////////////////////////LRESULT WINAPI MouseProc(int nCode, WPARAM wparam, LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam; if ((nCode >= 0) && (WM_LBUTTONDBLCLK == wparam))
{
HWND glhTargetWnd = pMouseHook->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, nCode, wparam, lparam); //继续传递消息
}CMouseHook::CMouseHook() //类构造函数
{
}CMouseHook::~CMouseHook() //类析构函数
{
StopHook();
}BOOL CMouseHook::StartHook(HWND hWnd) //安装钩子并设定接收显示窗口句柄
{
BOOL bResult = FALSE;
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)
{
glhPrevTarWnd = NULL;
glhDisplayWnd = NULL;//清变量
glhHook = NULL;
}
} return bResult;
}
一般情况下,DLL是数据段为个个进程私有,而代码段为所有进程公有。在下面这个小程序中,我想是可以不使用数据段共享的!
希望,有这方面经验的朋友,给予指点!谢谢!// MouseHook.cpp : Defines the initialization routines for the DLL.
//#include "stdafx.h"
#include <afxdllx.h>
#include "MouseHook.h"#pragma data_seg("mydata")
HINSTANCE glhInstance = NULL; // DLL实例句柄
HHOOK glhHook = NULL; // 安装的鼠标勾子句柄
HWND glhPrevTarWnd = NULL; // 上次鼠标所指的窗口句柄
HWND glhDisplayWnd = NULL; // 显示目标窗口标题编辑框的句柄
#pragma data_seg()#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE MouseHookDLL = { NULL, NULL };extern "C" 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; // 插入保存DLL实例句柄 }
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("MOUSEHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(MouseHookDLL);
}
return 1; // ok
}////////////////////////////////////////////////////////////////////LRESULT WINAPI MouseProc(int nCode, WPARAM wparam, LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam; if ((nCode >= 0) && (WM_LBUTTONDBLCLK == wparam))
{
HWND glhTargetWnd = pMouseHook->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, nCode, wparam, lparam); //继续传递消息
}CMouseHook::CMouseHook() //类构造函数
{
}CMouseHook::~CMouseHook() //类析构函数
{
StopHook();
}BOOL CMouseHook::StartHook(HWND hWnd) //安装钩子并设定接收显示窗口句柄
{
BOOL bResult = FALSE;
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)
{
glhPrevTarWnd = NULL;
glhDisplayWnd = NULL;//清变量
glhHook = NULL;
}
} return bResult;
}
解决方案 »
- 为什么 串口通信 分多次接收数据
- 100分求个最小化到托盘的Demo
- 服务器端的accept是如何获的客户端的IP的
- 调用win sock api 传输问题(TCP)
- 高分求救,关于句柄的关闭
- 如何截获Windows消息,并过虑?
- 请问大家,如何在一个视里面同时操作两个数据表啊?书上只说一个视类对一个表类,能不能统一在一个视中操作呢?
- 对话框中,使用CListCtrl,已在某一列中加入了ICON,如何去掉首列的ICON?
- SQL SERVER2000的存储问题
- 拿出50分,讨论一个基本的问题:new之后一定要判断得到的指针是否为NULL呢?
- 如何将一个程序进行打包?
- 请问如何放一个捷径在桌面上?
HWND glhPrevTarWnd = NULL; // 上次鼠标所指的窗口句柄
HWND glhDisplayWnd = NULL; // 显示目标窗口标题编辑框的句柄这两个变量的值,因此将它们标志为共享变量。
HWND glhPrevTarWnd = NULL; // 上次鼠标所指的窗口句柄
HWND glhDisplayWnd = NULL; // 显示目标窗口标题编辑框的句柄这两个变量的值,因此将它们标志为共享变量”想了想,我认为“HWND glhDisplayWnd = NULL; // 显示目标窗口标题编辑框的句柄”,这个参数值是我的应用程序传入的,不需要其他进程来修改,应该可以不共享的,到是“上次鼠标所指的窗口句柄”需要共享,因为会被其他鼠标双击的事件所改变!