为什么WH_CBT钩子得不到其他窗体消息?操作系统:xp sp3

zxcdewq 2010-03-22 09:05:50
dll里主要代码

设置全局钩子
hWinHook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,hInstance,0);

钩子回调函数
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{

if (nCode==HCBT_ACTIVATE)
{}
}

exe里LoadLibrary GetProcAddress,加载钩子后,只能得到本程序的消息,其他窗体的任何消息都得不到。

为什么?操作系统xp sp3
...全文
261 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2010-03-25
  • 打赏
  • 举报
回复
我在另一帖中回复了,你可以先试试。
zxcdewq 2010-03-24
  • 打赏
  • 举报
回复
是这样.
xp操作系统,鼠标放到任务栏的图标上,或者硬盘文件、文件夹上时,会有系统的提示框。显示文件大小,种类等信息。

即使自己程序设置为HWND_TOPMOST,这个系统的提示框还是会覆盖自己的程序界面。
估计因为这个提示框也是HWND_TOPMOST属性,并且后出来的可以覆盖我的程序界面。
我想如果得到这个系统提示框的句柄,然后把它设置成HWND_NOTOPMOST,或许可以不覆盖我的程序。
cnzdgs 2010-03-24
  • 打赏
  • 举报
回复
句柄是可以得到的,可能是设置的时机不对,或者不能通过这种方法来实现你要的效果。
zxcdewq 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cnzdgs 的回复:]
注意:文件句柄是只在本进程内有效的,每次写文件都要执行打开和关闭文件操作,不能通过全局变量(包括……
[/Quote]

原来这样。非常感谢!

我本想通过这个钩子得到系统弹出提示信息框的句柄,然后移动到我程序后面。
先把我的程序设置为HWND_TOPMOST,在钩子回调函数里调用SetWindowPos
SetWindowPos((HWND)wParam,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
但我试了WH_CBT、WH_SHELL,并没有得到这个句柄。

另开了一个帖子,请帮忙
http://topic.csdn.net/u/20100323/15/33e7ed0f-5ca0-4be6-a0fe-00ec1008447c.html
xp下,鼠标放到文件加上,弹出提示信息框。怎么得到这个框的句柄。并移动到我的程序后面。
cnzdgs 2010-03-23
  • 打赏
  • 举报
回复
另外补充一下,WH_KEYBOARD_LL钩子是在本进程中被调用的,所以没有跨进程的问题,也不需要使用DLL。
cnzdgs 2010-03-23
  • 打赏
  • 举报
回复
程序没问题,也不需要把句柄用共享变量保存。
对于其它进程的消息,CBTProc函数是在相应的进程中被调用的,在你调试程序的时候,你所调试的只是自己的进程,当其它进程中调用CBTProc函数时调试器不会察觉,所以使你误以为收不到其它进程的消息。你可以在CBTProc函数中通过写日志文件的方式来记录消息,注意:文件句柄是只在本进程内有效的,每次写文件都要执行打开和关闭文件操作,不能通过全局变量(包括共享变量)保存句柄。
Icedmilk 2010-03-22
  • 打赏
  • 举报
回复
记不清了啊,
我记得我当时写这个代码的时候是用到过共享数据段

因为要给自己的程序通知啊,所以要在共享数据段里存一个窗口句柄,好像是这样
WizardK 2010-03-22
  • 打赏
  • 举报
回复
看不懂,设置个WH_CBT钩子怎么都弄到DLL共享数据段了
Icedmilk 2010-03-22
  • 打赏
  • 举报
回复
对了忘了问一下你了,你怎么知道钩子过程没有执行?

如果是用sendmessage的方法,窗口句柄一定要保存到共享段

#pragma data_seg("MySeg")
HHOOK g_hCbtHook = NULL;
HANDLE g_hInst = NULL;
#pragma data_seg()
Icedmilk 2010-03-22
  • 打赏
  • 举报
回复
你弄一下共享段试试
zxcdewq 2010-03-22
  • 打赏
  • 举报
回复
win32 dll

hInstance是传入参数

BOOL WINAPI DllMain(
HANDLE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)

{

switch(fdwReason)
{

case DLL_PROCESS_ATTACH:
{
hInstance=(HINSTANCE)hinstDLL;
}
break;

case DLL_PROCESS_DETACH:
{
}
break;

}

return TRUE;

}
icefairy 2010-03-22
  • 打赏
  • 举报
回复
mark mark
Icedmilk 2010-03-22
  • 打赏
  • 举报
回复
hWinHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)CBTProc,hInstance,0);
这句里的hInstance是dll里的全局变量吧

这个变量是怎么初始化的?

我记的有个共享段什么的
好久没弄钩子了
zxcdewq 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icedmilk 的回复:]
你的dll句柄出现了问题

你要确保你的dll加载到目标进程之后能够正确的设置你的dll的句柄
[/Quote]

谢谢!能不能具体说一下怎么做?

我在exe里只是调用了加载钩子的函数。

dll:
int WINAPI SetHandle()
{
hWinHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)CBTProc,hInstance,0);
}

exe:
typedef int (CALLBACK* sthndl)();
sthndl SetHandle;

hLib = LoadLibrary("hooks.dll");
SetHandle = (sthndl)GetProcAddress(hLib, "SetHandle");
SetHandle();
liumenghappy 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icedmilk 的回复:]

你的dll句柄出现了问题

你要确保你的dll加载到目标进程之后能够正确的设置你的dll的句柄
[/Quote]
UP
Icedmilk 2010-03-22
  • 打赏
  • 举报
回复
你的dll句柄出现了问题

你要确保你的dll加载到目标进程之后能够正确的设置你的dll的句柄

16,472

社区成员

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

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

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