关于钩子的问题

JerryGR 2005-11-20 10:43:08
刚刚使用钩子编程,很多地方需要学习。
刚编写了一个钩子,是用来获得鼠标的当前位置的(代码如下)。可是发现一些问题。
鼠标在加载钩子的exe上时可以显示鼠标的位置,否则就没有捕获到鼠标的问题。希望高手指导一下:)

DLL代码:使用MFC Static DLL
// Hook.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "Hook.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHookApp

BEGIN_MESSAGE_MAP(CHookApp, CWinApp)
//{{AFX_MSG_MAP(CHookApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHookApp construction

CHookApp::CHookApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CHookApp object


#pragma data_seg("mydata")
CHookApp theApp;
POINT m_sPoint;
HHOOK m_sHook;
HWND m_sWnd;
#pragma data_seg()


static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(wParam==WM_MOUSEMOVE||wParam==WM_NCMOUSEMOVE)
{
MOUSEHOOKSTRUCT* pMsg = (MOUSEHOOKSTRUCT*)lParam;
TRACE("%X, %X\n", m_sWnd, pMsg->hwnd);
m_sPoint = ((MOUSEHOOKSTRUCT*)lParam)->pt;
//取鼠标信息
::SendMessage(m_sWnd, WM_USER+1, m_sPoint.x, m_sPoint.y);
}
return CallNextHookEx(m_sHook,nCode,wParam,lParam);
}

void __declspec(dllexport) WINAPI Install(HWND hWnd)
{
m_sWnd = hWnd;
m_sHook = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("hook.dll"), NULL);
//m_sHook = SetWindowsHookEx(WH_MOUSE, MouseProc, theApp.m_hInstance, 0);
}
void __declspec(dllexport) WINAPI UnInstall()
{
if(m_sHook)
UnhookWindowsHookEx(m_sHook);
}


//.h
// Hook.h : main header file for the HOOK DLL
//

#if !defined(AFX_HOOK_H__51B0782C_A177_4BA0_B380_C50AD56ED9A3__INCLUDED_)
#define AFX_HOOK_H__51B0782C_A177_4BA0_B380_C50AD56ED9A3__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h" // main symbols

/////////////////////////////////////////////////////////////////////////////
// CHookApp
// See Hook.cpp for the implementation of this class
//

class CHookApp : public CWinApp
{
public:
CHookApp();

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHookApp)
//}}AFX_VIRTUAL

//{{AFX_MSG(CHookApp)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

void __declspec(dllexport) WINAPI Install(HWND hWnd);
void __declspec(dllexport) WINAPI UnInstall();

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_HOOK_H__51B0782C_A177_4BA0_B380_C50AD56ED9A3__INCLUDED_)


//.DEF
; Hook.def : Declares the module parameters for the DLL.

LIBRARY "Hook"
DESCRIPTION 'Hook Windows Dynamic Link Library'

SETCTIONS
mydata READ WRITE SHARED

EXPORTS
Install
UnInstall
; Explicit exports can go here


//测试部分.exe 使用SDI,只有CView修改了代码。工程中加入hook.lib和对应的hook.h文件
#include "Hook.h"
int CTestHookView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

Install(m_hWnd);

return 0;
}
void CTestHookView::OnDestroy()
{
UnInstall();

CView::OnDestroy();

}

UINT CTestHookView::OnHookMsg(WPARAM wParam, LPARAM lParam)//对应的消息:
//#define WM_HOOKMSG (WM_USER+1)
//
//ON_MESSAGE(WM_HOOKMSG, OnHookMsg)
{
m_sPoint.x = wParam;
m_sPoint.y = lParam;
Invalidate();
return 0;
}
void CTestHookView::OnDraw(CDC* pDC)
{
CTestHookDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

CString strText;
strText.Format("x = %d, y = %d", m_sPoint.x, m_sPoint.y);
pDC->TextOut(10,10, strText);
}

...全文
160 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rageliu 2005-11-21
  • 打赏
  • 举报
回复
QQ:80719107

要是方便给我工程看看可以不
JerryGR 2005-11-21
  • 打赏
  • 举报
回复
第3个参数只要是DLL的Handle就可以了,与线程的监视是没有关系的
JerryGR 2005-11-21
  • 打赏
  • 举报
回复
修改了,使用保存的theApp.m_hInstance,结果还是一样的
wltg2001 2005-11-21
  • 打赏
  • 举报
回复
是全局钩子没错,我怀疑你在SetWindowsHookEx的第三个参数有点问题,虽然我说不出所以然,建议你在DLL的入口点中保存DLL的句柄,作为第三个参数.
JerryGR 2005-11-21
  • 打赏
  • 举报
回复
这个是全局钩子阿
俺是认真的看过MSDN的
alen_ghl 2005-11-21
  • 打赏
  • 举报
回复
m_sHook = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("hook.dll"), NULL);
这是全局的,最后一个参数NULL表示监控所有线程
rageliu 2005-11-21
  • 打赏
  • 举报
回复
钩子分全局和局部钩子2类!显然你使用的是局部钩子!所以只有加载钩子的进程有效!!

要实现全部监控!请使用全局钩子
JerryGR 2005-11-21
  • 打赏
  • 举报
回复
告诉我EMail,我发给你;)
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

15,465

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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