我写一个全局鼠标钩子,但是只能勾到当前进程消息,晕死了,特来求救
这个程序包含两个工程:GlobalHookDll(类型:win32dll)和HookTest(类型:win32Application)
GlobalHookDll代码如下(GlobalHookDll.cpp和export.def省略了stdafx.h和stdafx.cpp):
GlobalHookDll.cpp
// GlobalHookDll.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include <tchar.h>
#include <stdio.h>HINSTANCE g_hInst;
HHOOK g_hHook;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
g_hInst = (HINSTANCE)hModule;
return TRUE;
}LRESULT CALLBACK HookProc(
int nCode, // hook code
WPARAM wParam, // current-process flag
LPARAM lParam // message data
)
{
TCHAR DebugInfo[MAX_PATH];
memset(DebugInfo, 0, sizeof(DebugInfo));
if(nCode == HC_ACTION)
{
MOUSEHOOKSTRUCT* pMouseHookStruct = (MOUSEHOOKSTRUCT*)lParam;
_stprintf(DebugInfo, "HWND = 0x%x, \tMouseEvent = 0x%x\n", pMouseHookStruct->hwnd, wParam);
OutputDebugString(DebugInfo);
}
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}void StartHook()
{
g_hHook = SetWindowsHookEx(WH_MOUSE, HookProc, g_hInst, 0);
}void EndHook()
{
::UnhookWindowsHookEx(g_hHook);
}Export.def
LIBRARY "GlobalHookDll.dll"EXPORTS
StartHook @1
EndHook @2HookTest工程:(省略stdafx.cpp)
HookTest.cpp// HookTest.cpp : Defines the entry point for the application.
//#include "stdafx.h"
#include "mywnd.h"
CComModule _Module;int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
_Module.Init(NULL, hInstance);
CMyWnd wnd;
wnd.Create(NULL, CWindow::rcDefault, _T("aaa"),
WS_VISIBLE|WS_OVERLAPPEDWINDOW, WS_EX_OVERLAPPEDWINDOW);
wnd.SetWindowLong(GWL_STYLE, wnd.GetWindowLong(GWL_STYLE) | WS_EX_TOOLWINDOW);
MSG msg;
while(::GetMessage(&msg, 0, 0, 0))
::DispatchMessage(&msg);
_Module.Term();
return 0;
}mywnd.h// MyWnd.h: interface for the CMyWnd class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MYWND_H__4E8CF99E_3748_4CEC_9292_6CA8501A3592__INCLUDED_)
#define AFX_MYWND_H__4E8CF99E_3748_4CEC_9292_6CA8501A3592__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class CMyWnd : public CWindowImpl<CMyWnd>
{
public:
CMyWnd();
virtual ~CMyWnd();
public:
BEGIN_MSG_MAP(CMyWnd)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
END_MSG_MAP() // 当窗口建立时,安装钩子
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
m_hModule = LoadLibrary(_T("e:\\mycodes\\globalhookdll\\debug\\globalhookdll.dll"));
FARPROC start = GetProcAddress(m_hModule, _T("StartHook"));
if(start != 0)
start();
return 0;
}
// 关掉窗口时,撤消钩子,销毁窗口,并退出程序
LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
FARPROC end = GetProcAddress(m_hModule, _T("EndHook"));
if(end != 0)
end();
FreeLibrary(m_hModule);
DestroyWindow();
PostQuitMessage(0);
return 0;
} HMODULE m_hModule;
};#endif // !defined(AFX_MYWND_H__4E8CF99E_3748_4CEC_9292_6CA8501A3592__INCLUDED_)mywnd.cpp// MyWnd.cpp: implementation of the CMyWnd class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "MyWnd.h"//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CMyWnd::CMyWnd()
{}CMyWnd::~CMyWnd()
{}stdafx.h#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers#include <atlbase.h>
extern CComModule _Module;
#include <atlwin.h>
#endif省略的文件都是未做修改的文件
这个程序包含两个工程:GlobalHookDll(类型:win32dll)和HookTest(类型:win32Application)
GlobalHookDll代码如下(GlobalHookDll.cpp和export.def省略了stdafx.h和stdafx.cpp):
GlobalHookDll.cpp
// GlobalHookDll.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include <tchar.h>
#include <stdio.h>HINSTANCE g_hInst;
HHOOK g_hHook;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
g_hInst = (HINSTANCE)hModule;
return TRUE;
}LRESULT CALLBACK HookProc(
int nCode, // hook code
WPARAM wParam, // current-process flag
LPARAM lParam // message data
)
{
TCHAR DebugInfo[MAX_PATH];
memset(DebugInfo, 0, sizeof(DebugInfo));
if(nCode == HC_ACTION)
{
MOUSEHOOKSTRUCT* pMouseHookStruct = (MOUSEHOOKSTRUCT*)lParam;
_stprintf(DebugInfo, "HWND = 0x%x, \tMouseEvent = 0x%x\n", pMouseHookStruct->hwnd, wParam);
OutputDebugString(DebugInfo);
}
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}void StartHook()
{
g_hHook = SetWindowsHookEx(WH_MOUSE, HookProc, g_hInst, 0);
}void EndHook()
{
::UnhookWindowsHookEx(g_hHook);
}Export.def
LIBRARY "GlobalHookDll.dll"EXPORTS
StartHook @1
EndHook @2HookTest工程:(省略stdafx.cpp)
HookTest.cpp// HookTest.cpp : Defines the entry point for the application.
//#include "stdafx.h"
#include "mywnd.h"
CComModule _Module;int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
_Module.Init(NULL, hInstance);
CMyWnd wnd;
wnd.Create(NULL, CWindow::rcDefault, _T("aaa"),
WS_VISIBLE|WS_OVERLAPPEDWINDOW, WS_EX_OVERLAPPEDWINDOW);
wnd.SetWindowLong(GWL_STYLE, wnd.GetWindowLong(GWL_STYLE) | WS_EX_TOOLWINDOW);
MSG msg;
while(::GetMessage(&msg, 0, 0, 0))
::DispatchMessage(&msg);
_Module.Term();
return 0;
}mywnd.h// MyWnd.h: interface for the CMyWnd class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MYWND_H__4E8CF99E_3748_4CEC_9292_6CA8501A3592__INCLUDED_)
#define AFX_MYWND_H__4E8CF99E_3748_4CEC_9292_6CA8501A3592__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class CMyWnd : public CWindowImpl<CMyWnd>
{
public:
CMyWnd();
virtual ~CMyWnd();
public:
BEGIN_MSG_MAP(CMyWnd)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
END_MSG_MAP() // 当窗口建立时,安装钩子
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
m_hModule = LoadLibrary(_T("e:\\mycodes\\globalhookdll\\debug\\globalhookdll.dll"));
FARPROC start = GetProcAddress(m_hModule, _T("StartHook"));
if(start != 0)
start();
return 0;
}
// 关掉窗口时,撤消钩子,销毁窗口,并退出程序
LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
FARPROC end = GetProcAddress(m_hModule, _T("EndHook"));
if(end != 0)
end();
FreeLibrary(m_hModule);
DestroyWindow();
PostQuitMessage(0);
return 0;
} HMODULE m_hModule;
};#endif // !defined(AFX_MYWND_H__4E8CF99E_3748_4CEC_9292_6CA8501A3592__INCLUDED_)mywnd.cpp// MyWnd.cpp: implementation of the CMyWnd class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "MyWnd.h"//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CMyWnd::CMyWnd()
{}CMyWnd::~CMyWnd()
{}stdafx.h#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers#include <atlbase.h>
extern CComModule _Module;
#include <atlwin.h>
#endif省略的文件都是未做修改的文件
解决方案 »
- 有没有结合visio讲解uml的书籍呀 C++版本的
- Button自绘问题(抗锯齿)
- 请教一个带有浓烈图形数学味道的问题!
- lpdword 转化 char*
- 如何实现像电驴输入URL"ed2k://slkdflsjldflsdf"就能跳到指定的程序打开?高分求助
- 想开发信息管理系统,delphi开发效率高,VC++功能强大,怎样将两者的优点集合起来呢?郁闷中...
- 如何用VC来获得寄存器的内容!
- 请教GDI+,创建位深度1bit(4bit,8bit)bmp图像并且在上面绘图
- 搞了一天没搞定,急死了。无法定位程序输入点于**.dll
- 请教各位大虾:关于随机数的问题??有难度.
- 一个关于COM接口参数的简单问题,高分跪地求教
- [不同对话框]DlgA调用DlgB里的public函数Func会出错呢?
#pragma data_seg("Shared")
HHOOK g_hHook;
#pragma data_seg()
#pragma comment(linker, "/section:Shared, rws")
支持flyelf(空谷清音);