环境32位xp,vc2005,这个是跨窗口子类化的DLL,从CSDN上拷贝的
----------------------------
#include "stdafx.h"
//////////////////////////////////////////////////////////////////////
//共享数据段
#pragma data_seg(".MYDATA")
HHOOK g_hProc = NULL; // 钩子窗口 过程句柄
WNDPROC OldProc=NULL;//子类化窗口 过程地址
HWND hookhandle=NULL;//挂钩的窗口句柄
bool subReady=FALSE;//子类化标志 识别
int handleMessage=NULL;//消息句柄,撤销子类化
int handleMessage2=NULL;//消息句柄,捕捉到 动作
int handleMessage3=NULL;//消息句柄,动作达到限定
HWND Resivehandle=NULL;//接收消息的vb窗口句柄
long Maxcount=NULL;//最大打标次数限定
#pragma data_seg()
#pragma comment(linker,"/SECTION:.MYDATA,RWS")
//////////////////////////////////////////////////////////////////////
HINSTANCE g_hInstDLL=NULL; //DLL实例句柄
//////////////////////////////////////////////////////////////////////
//DLL入口 函数
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
g_hInstDLL=(HINSTANCE)hModule;
handleMessage = RegisterWindowMessage("MyMessage");
handleMessage2 = RegisterWindowMessage("note");
handleMessage3 = RegisterWindowMessage("stop");
return TRUE;
}
//最大打标次数限定,接收消息的vb窗口句柄,赋值代码
long __stdcall info(HWND ju,long maxtime) //参数p1,p2
{
Resivehandle=ju;
Maxcount=maxtime;
return 1;
}
//////////////////////////////////////////////////////////////////////
//子类化窗口过程函数
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
//在这做出对消息的处理
static long COUNTS;
if (uMsg==(unsigned int)handleMessage)//收到撤销子类化消息
{
Beep(700,5);
SetWindowLong(hookhandle,GWL_WNDPROC,(long)OldProc);
subReady=FALSE;
return TRUE;
}
if (uMsg==WM_LBUTTONDOWN && COUNTS==Maxcount)//达到限定次数
{
PostMessage(Resivehandle,handleMessage3,0,0);
COUNTS=0;
//Beep(700,5);
return TRUE;
}
if (uMsg==WM_LBUTTONDOWN )//收到鼠标左键按下消息
{
PostMessage(Resivehandle,handleMessage2,0,0);
COUNTS++;
Beep(700,5);
}
//将窗口消息传递给Windows处理
return (long)CallWindowProcA(OldProc,hwnd,uMsg,wParam,lParam);
}
//////////////////////////////////////////////////////////////////////
//钩子 过程函数
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (subReady==FALSE)
{
OldProc=(WNDPROC)GetWindowLong(hookhandle,GWL_WNDPROC);
SetWindowLong(hookhandle,GWL_WNDPROC,(long)WindowProc);
subReady=TRUE;
}
return CallNextHookEx(g_hProc, nCode, wParam, lParam);
}
//////////////////////////////////////////////////////////////////////
// 挂接钩子函数
long __stdcall WINAPI SetHook(HWND ju2)
{
DWORD dwThreadID;
hookhandle=ju2;
if (ju2 != NULL)
{
// 挂接钩子
subReady=FALSE;
dwThreadID =GetWindowThreadProcessId(ju2, NULL);
g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID);
}
else
{
// 卸载钩子
UnhookWindowsHookEx(g_hProc);
}
return 1;
}
----------------------
; DLL-for-zhuru.def : 声明 DLL 的模块参数。LIBRARY "DLL-for-zhuru"EXPORTS
; 此处可以是显式导出
info @1
SetHook @2
-----------------------------------------------
大家帮我看一下,生成时,出现三个错误,三个警告
-----------------------------------------------
1>------ 已启动生成: 项目: DLL-for-zhuru, 配置: Debug Win32 ------
1>正在编译...
1>DLL-for-zhuru.cpp
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(25) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [10]”转换为“LPCWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(26) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [5]”转换为“LPCWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(27) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [5]”转换为“LPCWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(54) : warning C4311: “类型转换”: 从“WNDPROC”到“long”的指针截断
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(81) : warning C4312: “类型转换”: 从“LONG”转换到更大的“WNDPROC”
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(82) : warning C4311: “类型转换”: 从“LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)”到“long”的指针截断
1>生成日志保存在“file://d:\test-pro\DLL-for-zhuru\DLL-for-zhuru\Debug\BuildLog.htm”
1>DLL-for-zhuru - 3 个错误,3 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
-------------------------------------------------------------------------------------------------------------
请教,为什么?
如果您有现成的实例的话,发给我个,多谢多谢....最好是宿主程序,主程序,注入DLL,多谢多谢,小妹拜谢....我全部的分都拿出来了..
----------------------------
#include "stdafx.h"
//////////////////////////////////////////////////////////////////////
//共享数据段
#pragma data_seg(".MYDATA")
HHOOK g_hProc = NULL; // 钩子窗口 过程句柄
WNDPROC OldProc=NULL;//子类化窗口 过程地址
HWND hookhandle=NULL;//挂钩的窗口句柄
bool subReady=FALSE;//子类化标志 识别
int handleMessage=NULL;//消息句柄,撤销子类化
int handleMessage2=NULL;//消息句柄,捕捉到 动作
int handleMessage3=NULL;//消息句柄,动作达到限定
HWND Resivehandle=NULL;//接收消息的vb窗口句柄
long Maxcount=NULL;//最大打标次数限定
#pragma data_seg()
#pragma comment(linker,"/SECTION:.MYDATA,RWS")
//////////////////////////////////////////////////////////////////////
HINSTANCE g_hInstDLL=NULL; //DLL实例句柄
//////////////////////////////////////////////////////////////////////
//DLL入口 函数
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
g_hInstDLL=(HINSTANCE)hModule;
handleMessage = RegisterWindowMessage("MyMessage");
handleMessage2 = RegisterWindowMessage("note");
handleMessage3 = RegisterWindowMessage("stop");
return TRUE;
}
//最大打标次数限定,接收消息的vb窗口句柄,赋值代码
long __stdcall info(HWND ju,long maxtime) //参数p1,p2
{
Resivehandle=ju;
Maxcount=maxtime;
return 1;
}
//////////////////////////////////////////////////////////////////////
//子类化窗口过程函数
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
//在这做出对消息的处理
static long COUNTS;
if (uMsg==(unsigned int)handleMessage)//收到撤销子类化消息
{
Beep(700,5);
SetWindowLong(hookhandle,GWL_WNDPROC,(long)OldProc);
subReady=FALSE;
return TRUE;
}
if (uMsg==WM_LBUTTONDOWN && COUNTS==Maxcount)//达到限定次数
{
PostMessage(Resivehandle,handleMessage3,0,0);
COUNTS=0;
//Beep(700,5);
return TRUE;
}
if (uMsg==WM_LBUTTONDOWN )//收到鼠标左键按下消息
{
PostMessage(Resivehandle,handleMessage2,0,0);
COUNTS++;
Beep(700,5);
}
//将窗口消息传递给Windows处理
return (long)CallWindowProcA(OldProc,hwnd,uMsg,wParam,lParam);
}
//////////////////////////////////////////////////////////////////////
//钩子 过程函数
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (subReady==FALSE)
{
OldProc=(WNDPROC)GetWindowLong(hookhandle,GWL_WNDPROC);
SetWindowLong(hookhandle,GWL_WNDPROC,(long)WindowProc);
subReady=TRUE;
}
return CallNextHookEx(g_hProc, nCode, wParam, lParam);
}
//////////////////////////////////////////////////////////////////////
// 挂接钩子函数
long __stdcall WINAPI SetHook(HWND ju2)
{
DWORD dwThreadID;
hookhandle=ju2;
if (ju2 != NULL)
{
// 挂接钩子
subReady=FALSE;
dwThreadID =GetWindowThreadProcessId(ju2, NULL);
g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID);
}
else
{
// 卸载钩子
UnhookWindowsHookEx(g_hProc);
}
return 1;
}
----------------------
; DLL-for-zhuru.def : 声明 DLL 的模块参数。LIBRARY "DLL-for-zhuru"EXPORTS
; 此处可以是显式导出
info @1
SetHook @2
-----------------------------------------------
大家帮我看一下,生成时,出现三个错误,三个警告
-----------------------------------------------
1>------ 已启动生成: 项目: DLL-for-zhuru, 配置: Debug Win32 ------
1>正在编译...
1>DLL-for-zhuru.cpp
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(25) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [10]”转换为“LPCWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(26) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [5]”转换为“LPCWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(27) : error C2664: “RegisterWindowMessageW”: 不能将参数 1 从“const char [5]”转换为“LPCWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(54) : warning C4311: “类型转换”: 从“WNDPROC”到“long”的指针截断
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(81) : warning C4312: “类型转换”: 从“LONG”转换到更大的“WNDPROC”
1>d:\test-pro\dll-for-zhuru\dll-for-zhuru\dll-for-zhuru.cpp(82) : warning C4311: “类型转换”: 从“LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)”到“long”的指针截断
1>生成日志保存在“file://d:\test-pro\DLL-for-zhuru\DLL-for-zhuru\Debug\BuildLog.htm”
1>DLL-for-zhuru - 3 个错误,3 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
-------------------------------------------------------------------------------------------------------------
请教,为什么?
如果您有现成的实例的话,发给我个,多谢多谢....最好是宿主程序,主程序,注入DLL,多谢多谢,小妹拜谢....我全部的分都拿出来了..
handleMessage2 = RegisterWindowMessage("note");
handleMessage3 = RegisterWindowMessage("stop");
改成这样 RegisterWindowMessage(TEXT("MyMessage")); 其他2个一样加上 TEXT() 就行了
这句提示:warning C4311: “类型转换”: 从“WNDPROC”到“long”的指针截断
这个怎么改?
--写程序真辛苦...
写成这样:RegisterWindowMessage(L"MyMessage"); 用L还是用TEXT都可以,不过都不能加括号。
----------------真是麻烦您了.
1>------ 已启动生成: 项目: DLL-for-zhuru, 配置: Debug Win32 ------
1>正在链接...
1>mfcs80ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 DLL-for-zhuru.obj 中定义
1> 正在创建库 D:\test-pro\DLL-for-zhuru\Debug\DLL-for-zhuru.lib 和对象 D:\test-pro\DLL-for-zhuru\Debug\DLL-for-zhuru.exp
1>D:\test-pro\DLL-for-zhuru\Debug\DLL-for-zhuru.dll : fatal error LNK1169: 找到一个或多个多重定义的符号
1>生成日志保存在“file://d:\test-pro\DLL-for-zhuru\DLL-for-zhuru\Debug\BuildLog.htm”
1>DLL-for-zhuru - 2 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
不建议直接用L,_T和TEXT是宏,要加括号的
除非这样RegisterWindowMessageW(L"MyMessage");
看看最新的SDK或MSDN吧
SetWindowLong最后一个参数是LONG_PTR,
#define SetWindowLongPtr SetWindowLong
SetWindowLong(hookhandle,GWL_WNDPROC,(LONG_PTR)OldProc);
就是DllMain定义重复啦新建项目后,IDE会在生成的某个cpp文件中添加DllMain了
而你复制的代码中又含有DllMain函数
定时SendMessage WM_GETTEXT
handleMessage2 = RegisterWindowMessage(L"note");
handleMessage3 = RegisterWindowMessage(L"stop");