关于Shell Hook 的问题。 (up有分)

ahr 2002-04-03 04:14:53
加精
我用hhook = SetWindowsHookEx(WH_SHELL, ShellHook_HookProc, g_hinstDll, 0);
安装了个钩子。
然后一切 Shell的控制都不能用了 如:CTRL+ESC,在任务栏现现实最小化的那的东东。
我在ShellHook_HookProc也写CallNextHookEx(g_hhook, nCode, wParam, lParam);
但是似乎就是不能把消息再往下传了!!!!
...全文
254 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahr 2002-04-04
  • 打赏
  • 举报
回复
to : fz_zhou(vcfan) ,关于这方面的资料,我是看的http://jjhou.csdn.net/
里的《Win95 程式设计指南》
ahr 2002-04-04
  • 打赏
  • 举报
回复
啊哦。我的g_hhook=NULL;居然没有共享,哈哈。
这样,我的CallNextHookEx(g_hhook, nCode, wParam, lParam);肯定会有问题啦。解决了,多谢(阿毛)!
给分了!
ahr 2002-04-04
  • 打赏
  • 举报
回复
to han012(阿毛) :
是共享的啦
#pragma data_seg ("shareddata")
HWND g_hwndNC = NULL;
#pragma data_seg()

SECTIONS
shareddata READ WRITE SHARED

你做过shellhook吗?能不能给我个例子看看。我的都行,就是破坏原有操作
han012 2002-04-04
  • 打赏
  • 举报
回复
你的g_hhook变量是全局变量,要在不同进程中被参考,所以一定要放在共享段中,
如下:

#pragma data_seg("mydata")
HHOOK g_hhook=NULL;

HWND glhPrevTarWnd=NULL;
HWND glhDisplayWnd=NULL;
HINSTANCE glhInstance=NULL;
#pragma data_seg()

#pragma comment(linker,"/SECTION:mydata,RWS")

你是这样做的?
ahr 2002-04-04
  • 打赏
  • 举报
回复
我是做在dll里的啦。而且,消息也都能钩到。
现在的问题是,安装了我的钩子, 一切 Shell的控制都不能用了 如:CTRL+ESC,在任务栏现现实最小化的那的东东。
我不想破坏原有的windows操作,我在回调函数里应该怎样写?
han012 2002-04-04
  • 打赏
  • 举报
回复
关于我的2点疑问:

1)Hook Procedures的原型如下
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
);
你为什么定义为如下格式?
static LRESULT WINAPI ShellHook_HookProc
(int nCode,WPARAM wParam, LPARAM lParam)

2)你安装的全局Hook,全局Hook一定是以DLL形式存在的.
你是这样做的吗?

我不是大明 2002-04-04
  • 打赏
  • 举报
回复
HOOK 看了还是不懂的!有没有这方面比较好的书让偶来 钩钩看好不好玩!
ahr 2002-04-04
  • 打赏
  • 举报
回复
//下面是我的代码
BOOL WINAPI ShellHookStart (HWND hwndNC)
{
HHOOK hhook = NULL;
if (g_hhook != NULL)
return(FALSE);
if(g_hinstDll == NULL)
return FALSE;
g_hwndNC = hwndNC;
Sleep(0);
hhook = SetWindowsHookEx(WH_SHELL, ShellHook_HookProc, g_hinstDll, 0);
InterlockedExchange((PLONG) &g_hhook, (LONG) hhook);
return(g_hhook != NULL);
}

//回调函数这么简单都不行:(
static LRESULT WINAPI ShellHook_HookProc (int nCode,WPARAM wParam, LPARAM lParam)
{
TCHAR sz[128];//, szPath[128];
LRESULT lResult;
// HWND hwnd = (HWND) wParam;
lResult = CallNextHookEx(g_hhook, nCode, wParam, lParam);
return lResult;
}

ahr 2002-04-04
  • 打赏
  • 举报
回复
//下面是我的代码
BOOL WINAPI ShellHookStart (HWND hwndNC)
{
HHOOK hhook = NULL;
if (g_hhook != NULL)
return(FALSE);
if(g_hinstDll == NULL)
return FALSE;
g_hwndNC = hwndNC;
Sleep(0);
hhook = SetWindowsHookEx(WH_SHELL, ShellHook_HookProc, g_hinstDll, 0);
preempted whilst
variable atomically.
InterlockedExchange((PLONG) &g_hhook, (LONG) hhook);
return(g_hhook != NULL);
}

//回调函数这么简单都不行:(
static LRESULT WINAPI ShellHook_HookProc (int nCode,WPARAM wParam, LPARAM lParam)
{
TCHAR sz[128];//, szPath[128];
LRESULT lResult;
// HWND hwnd = (HWND) wParam;
lResult = CallNextHookEx(g_hhook, nCode, wParam, lParam);
return lResult;
}
bswangming 2002-04-03
  • 打赏
  • 举报
回复
WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)
HOOK过程
为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。该函数语法如下:
public function MyHook(nCode,wParam,iParam) as long
‘加入代码
end function
其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。
SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。
[注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。
全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。
[注释] 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。
HOOK类型
WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK
WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。
WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。
WH_CBT Hook
系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执行上面的操作。
WH_DEBUG HOOK
系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该HOOK决定是否让系统执行某种类型的HOOK。
WH_FOREGROUNDIDLE Hook
系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。
WH_GETMESSAGE Hook
WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。
WH_JOURNALRECORD Hook
WH_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。
WH_JOURNALPLAYBACK Hook
` WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。
WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。
WH_KEYBOARD Hook
WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。
WH_MOUSE Hook
WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。
WH_MSGFILTER and WH_SYSMSGFILTER Hooks
WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。
WH_SHELL Hook
一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。
使用HOOK
安装、消毁HOOK过程
监视系统事件

安装、消毁HOOK过程
使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。
为了安装一个全局HOOK过程,必须在应用程序外建立一个DLL,并将该HOOK函数封装到其中,应用程序在安装全局HOOK过程时必须先得到该DLL模块的句柄。将DLL名传递给LoadLibrary 函数,就会得到该DLL模块的句柄;得到该句柄 后,使用GetProcAddress函数可以得到HOOK过程的地址。最后,使用SetWindowsHookEx将HOOK过程的首址嵌入相应的HOOK链中,SetWindowsHookEx传递一个模块句柄,它为HOOK过程的进入点,线程标识符置为0,指出:该HOOK过程同系统中的所有线程关联。
以下是C写的例程,大家可以方便的转换为VB程序。
HOOKPROC hkprcSysMsg;
static HINSTANCE hinstDLL;
static HHOOK hhookSysMsg;
.
.
.

hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll");
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc");
hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER,
hkprcSysMsg, hinstDLL, 0);

itaolu 2002-04-03
  • 打赏
  • 举报
回复
have u set the Hook procudure in a DLL?
webber84 2002-04-03
  • 打赏
  • 举报
回复
把你的代码贴出来看看,光说说不清楚的。

16,471

社区成员

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

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

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