一个Mouse钩子的DLL问题-》麻烦各位解释一下每句的意思,看不太明白《-问题解释就结贴

Micro_Sheng 2004-01-06 05:12:51
下面是一段处理Mouse的代码,但在头文件中并没有声明,在一个DLL中不是要一个入口主函数(DLLMain)就行吗?在什么情况下会调用以下函数呀???

extern "C" _declspec(dllexport) LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode>=0)
{
if(wParam==WM_LBUTTONDOWN)
Condition1=1;
if(wParam==WM_LBUTTONUP)
Condition1=0;
if(wParam==WM_RBUTTONDOWN)
Condition2=1;
if(wParam==WM_RBUTTONUP)
Condition2=0;

if(Condition1 & Condition2)
{
Condition1=Condition2=0;
HideOrVisitableFlag=!HideOrVisitableFlag;
if(HideOrVisitableFlag)
{
::EnumWindows(CMousehook::EnumWindowsProc,NULL);
}

if(!HideOrVisitableFlag)
while(Global_i>0)
{
Global_i--;
::ShowWindow(GlobalWndHandle[Global_i],SW_SHOW);
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);

}
return CallNextHookEx(glhHook,nCode,wParam,lParam);

中外还定义了一个系统回调的钩子函数(如下),它们的调用顺序是怎么样的???
BOOL CMousehook::EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char buff[256];
if(Check1==0)
{
::GetWindowText(hwnd,buff,255);
if(!lstrcmp(buff,"Program Manager"))
return 1;
}

if(Check2==0)
{
::GetClassName(hwnd,buff,255);
if(!lstrcmp(buff,"Shell_TrayWnd"))
return 1;
}

if(GetWindowLong(hwnd,GWL_STYLE) & WS_VISIBLE)
{
if(Check3)
{
::GetWindowText(hwnd,buff,255);
if(!lstrcmp(buff,"魔高一丈"))
return 1;
::ShowWindow(hwnd,SW_HIDE);
::SendMessage(hwnd,WM_CLOSE,0,0);
//::SendMessage(hwnd,WM_DESTROY,0,0);
//::SendMessage(hwnd,WM_NCDESTROY,0,0);
return 1;
}
GlobalWndHandle[Global_i]=hwnd;
Global_i++;
ShowWindow(hwnd,SW_HIDE);
}

return 1;
}

}

我学VC时间不长,是不是问的有点离谱?不要见笑哟!!
...全文
65 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
heyanghappy 2004-01-07
  • 打赏
  • 举报
回复
extern "C" _declspec(dllexport) dll中接口函数引出时的声明。只有声明了才可以在其他装载了这个dll的程序中调用该函数

再具体点:

如果我们声明extern "C",则使用C++的便以方式,引出函数产生一个其他语言不能使用的修饰名,如果我们希望在引用时使用普通名MouseProc,则必须声明extern "C"

WINAPI声明的是函数参数压栈退栈方式(即为__stdcall,Pascal调用约定)。还可以声明为__cdecl,这个是C++默认方式。

_declspec(dllexport),即export这个函数接口。在使用时可以
先声明extern "C" _declspec(dllimport) LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
然后直接使用MouseProc函数。


heyanghappy 2004-01-07
  • 打赏
  • 举报
回复
你在主程序中将dll中的MouseProc鼠标钩子函数挂在了鼠标Hook链最前端。(看你钩子函数的内容估计是将钩子挂在了所有进程中)。当点击鼠标时,首先调用MouseProc函数,在调用其他的鼠标处理函数。

至于EnumWindowsProc,
在你同时点击鼠标左右健时,MouseProc函数调用EnumWindows列举系统中所有顶级窗口,每次列举一个窗口便执行一次EnumWindowsProc回调函数。EnumWindowsProc函数将窗口句柄保存起来并隐藏窗口。
当你再次同时点击鼠标左右健时,MouseProc函数将所有隐藏的窗口显示出来。

最后的效果就是你不停的点击鼠标左右健,所有窗口反复的全部隐藏,又全部显示。

不知道我解释的清楚不清楚。
dxp 2004-01-07
  • 打赏
  • 举报
回复
extern "C" 一般是表名函数调用的规则,比如函数参数的压栈顺序(从右到左还是左到右).
_declspec(dllexport) 是dll函数导出标识啊.
Micro_Sheng 2004-01-07
  • 打赏
  • 举报
回复
这个问题是不是有一定难度?
laomai 2004-01-07
  • 打赏
  • 举报
回复
mark
Micro_Sheng 2004-01-07
  • 打赏
  • 举报
回复
extern "C" _declspec(dllexport) 是什么意思呀
Micro_Sheng 2004-01-07
  • 打赏
  • 举报
回复
谢谢各位,我差不多清楚了,但在制作DLL中鼠标消息处理函数前加上下面一段是什么意思呀:
extern "C" _declspec(dllexport)

还有上面的3个Check是三个全局变量,可以改变的
888atao 2004-01-07
  • 打赏
  • 举报
回复
楼上的已经解释的很详细了
两个都是回调函数,是由系统在适当的时候
(1是触发HOOK时 2是调用EnumWindows时)自动调用的

关键是你的Check是什么东东啊
不知道它我也没有办法
因为用它的地方很多
还有这是个什么程序
lin23 2004-01-07
  • 打赏
  • 举报
回复
从DLL导出函数有两种方法:1使用模块定义(.DEF)文件;2在函数中定义实用_declspec(dllexport)关键字。
将函数导入应用程序或DLL程序中可以使用DEF文件或_declspce(dllimport)两种方法。为是导入可执行文件能够访问DLL的公共数据符号和对象,必须使用_declspce(dllimport)。
Micro_Sheng 2004-01-06
  • 打赏
  • 举报
回复
大家参与呀!!!!
Micro_Sheng 2004-01-06
  • 打赏
  • 举报
回复
To:flyelf(空谷清音)
它们的调用顺序是怎样的?
flyelf 2004-01-06
  • 打赏
  • 举报
回复
MouseProc是安装了鼠标钩子后,自动调用的
这两个函数应该都是在dll中被调用的
Micro_Sheng 2004-01-06
  • 打赏
  • 举报
回复
怎么没人回答呀?
555555555555555555555555555555。。。。。。。。。。。。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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