获取窗口激活消息的钩子函数
来源:互联网 发布:急需网络兼职工作 编辑:程序博客网 时间:2024/06/06 11:49
http://blog.sina.com.cn/s/blog_498c7cd50100mdjv.html
自己尝试做了一个获取窗口激活消息的钩子函数,能顺利编译运行,特将过程和代码贴在下面:
目的:有窗口被点击,钩子函数就能拦截到该消息,并通知给主程序。钩子程序:使用全局钩子,建立dll。
主程序:使用控制台程序
环境:使用visual studio 2005 c++
1.创建dll程序
dlltest.cpp代码如下:
#include "stdafx.h"
#include "Log.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
#pragma data_seg(".mydata")
HHOOK hkb = NULL; //安装窗口钩子句柄;
HWND hwndmain=NULL; //调用钩子的主窗体句柄
HINSTANCE hins = NULL;//DLL实例句柄
#pragma data_seg()
#pragma comment(linker,"/SECTION:.mydata,RWS") // tell linker: make it shared
#define WM_THREADFIREEVENT1 WM_APP+111
BOOL APIENTRY DllMain( HMODULE hModule,
{
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
LRESULT
{
}
extern "C" BOOL _declspec(dllexport) stopHOOK()
{
}
extern "C" BOOL _declspec(dllexport) startHOOK(HWND m_hwnd)
{
}
2.在dlltest.p中将startHOOK()和stopHOOK()设置为可供外部调用的函数,代码如下:
#ifndef DLLTEST_H
#define DLLTEST_H
extern "C" BOOL _declspec(dllexport) startHOOK(HWND m_hwnd);
extern "C" BOOL _declspec(dllexport) stopHOOK();
#endif
3.在dlltest.def中设置共享变量和外部调用函数,代码如下:
LIBRARY
EXPORTS
startHOOK
stopHOOK
SECTIONS
.mydata READ WRITE SHARED
以上是dll的部分,接下来是主程序的部分,主程序由于是非mfc程序,所以没有窗口,为了接收dll传过来的消息,在主程序中通过api函数建立了一个隐藏窗口,用以接收从dll中获取的消息。具体代码如下:
// dllCall.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <string>
#include <WinUser.h>
//#include <IMessage.h>
#pragma comment(lib,"..\\Release\\dlltest.lib") //静态调用dll文件,必须将上面生成的dlltest.lib和dlltest.dll文件放到主程序的运行目录下
using namespace std;
extern "C" BOOL _declspec(dllimport)startHOOK(HWND hwnd);
extern "C" BOOL _declspec(dllimport)stopHOOK();
#define WM_THREADFIREEVENT1 WM_APP+111
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wparam,LPARAM lparam); //定义窗口过程函数
int _tmain(int argc, _TCHAR* argv[])
{