我写一个全局鼠标钩子,但是只能勾到当前进程消息,晕死了,特来求救
这个程序包含两个工程: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省略的文件都是未做修改的文件