MFC HOOK的使用

首先要将钩子装入:

HHOOK m_menuHook;
m_menuHook = SetWindowsHookEx(WH_MSGFILTER, HookProc, NULL, GetCurrentThreadId());

然后实现钩子函数:

LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{

	if (code == MSGF_MENU)
	{
		MSG * pMsg = (MSG*)lParam;
		if (pMsg->message == WM_MOUSEMOVE)
		{
			//计算坐标,当鼠标到了某个位置需要销毁菜单时,给拥有菜单的窗口发送WM_CANCELMODE消息。
			HWND h = WindowFromPoint(pMsg->pt);
			SendMessage(h, WM_MOUSEMOVE, wParam, lParam);
			//OnMouseMove(0,mt->pt);
		}
	}

	return CallNextHookEx(NULL, code, wParam, lParam);
}

HHOOK SetWindowsHookEx(
	int idHook,        // 钩子类型
	HOOKPROC lpfn,     // 自己实现的钩子函数地址,也就是函数名
	HINSTANCE hMod,    // 应用程序实例的句柄
	DWORD dwThreadId   // 要Hook的线程
);

钩子类型有:

WH_CALLWNDPROC

Installs a hook procedure that monitors messages before the system sends them to the destination window procedure. For more information, see theCallWndProc hook procedure.

WH_CALLWNDPROCRET

Installs a hook procedure that monitors messages after they have been processed by the destination window procedure. For more information, see theCallWndRetProc hook procedure.

WH_CBT

Installs a hook procedure that receives notifications useful to a computer-based training (CBT) application. For more information, see theCBTProc hook procedure.

WH_DEBUG

Installs a hook procedure useful for debugging other hook procedures. For more information, see theDebugProc hook procedure.

WH_FOREGROUNDIDLE

Installs a hook procedure that will be called when the application's foreground thread is about to become idle. This hook is useful for performing low priority tasks during idle time. For more information, see theForegroundIdleProc hook procedure.

WH_GETMESSAGE

Installs a hook procedure that monitors messages posted to a message queue. For more information, see theGetMsgProc hook procedure.

WH_JOURNALPLAYBACK

Installs a hook procedure that posts messages previously recorded by a WH_JOURNALRECORD hook procedure. For more information, see theJournalPlaybackProc hook procedure.

WH_JOURNALRECORD

Installs a hook procedure that records input messages posted to the system message queue. This hook is useful for recording macros. For more information, see theJournalRecordProc hook procedure.

WH_KEYBOARD

Installs a hook procedure that monitors keystroke messages. For more information, see theKeyboardProc hook procedure.

WH_KEYBOARD_LL

Windows NT: Installs a hook procedure that monitors low-level keyboard input events. For more information, see theLowLevelKeyboardProc hook procedure.

WH_MOUSE

Installs a hook procedure that monitors mouse messages. For more information, see theMouseProc hook procedure.

WH_MOUSE_LL

Windows NT: Installs a hook procedure that monitors low-level mouse input events. For more information, see theLowLevelMouseProc hook procedure.

WH_MSGFILTER

Installs a hook procedure that monitors messages generated as a result of an input event in a dialog box, message box, menu, or scroll bar. For more information, see theMessageProc hook procedure.

WH_SHELL

Installs a hook procedure that receives notifications useful to shell applications. For more information, see theShellProc hook procedure.

WH_SYSMSGFILTER

 

详见MSDN。

每一种钩子的类型决定了钩子实现函数的两个参数的具体意义。

钩子实现函数是个回调函数,可以将该回调函数写成全局函数,或者封装到类内成为类的成员函数。但是若封装到类内,必须为static函数。

 

实现函数固定写法:

LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
}
其中 HookProc 是自定义函数名

里面的三个参数按照钩子类型的不同,意义不同。如钩子类型为WH_MOUSE,则参照上表或者MSDN可以得知该实现函数的写法应为MouseProc()函数的写法。该函数写法在MSDN中的定义为:

LRESULT CALLBACK MouseProc(
	int nCode,      // hook code
	WPARAM wParam,  // 鼠标消息ID
	LPARAM lParam   // 鼠标坐标
);

三个函数都有详细的解释。然后做实现即可。记得在实现函数最后加上

return CallNextHookEx(NULL, code, wParam, lParam);
最后,钩子使用完毕后要对其进行释放,函数为UnhookWindowsHookEx();

注意钩子的后两个参数,若最后一个参数为0,则钩子为全局钩子,前面第三个参数一定要给出所要挂钩的进程句柄。全局钩子可以钩到所有正在运行的进程,通过传进来的进程句柄,可以对所有正在运行的进程做操作。这也就是外挂的原理。

若最后一个参数不为0,则最后一个参数需要指定所要挂载的进程。钩子第三个参数可以为0,此时钩子只对挂载的进程有效,只能钩到挂载进程的消息。注意,如果想实现这样一个功能:点击对话框外面的区域令对话框关闭。此时使用了该对话框的进程做参数,那么钩子只能钩到本进程的消息,而本进程的消息是仅局限于对话框内的,对话框外的点击消息并不属于本对画框,所以钩子也就无法钩到,从而无法实现该功能。但是该功能可以通过全局钩子实现。但全局钩子意味着该关闭操作可以对所有正在运行的进程有效。解决这个问题的方法是在钩子的功能实现函数中指定具体的进程来进行关闭操作。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在React中,使用上下文(context)可以方便地在组件之间共享数据。通过使用React的Hooks中的useContext钩子,我们可以更简单地使用上下文。 首先,我们需要创建一个上下文对象,可以使用React的createContext函数来创建。这个上下文对象可以包含我们想要共享的任何类型的数据。 然后,在函数组件中使用useContext钩子来读取上下文的值。使用useContext时,我们需要将上下文对象作为参数传递给它,它将返回上下文的当前值。 需要注意的是,尽管可以使用useContext读取上下文的值,但我们仍然需要在上层组件树中使用<MyContext.Provider>来为下层组件提供上下文。这个<MyContext.Provider>组件接收一个value属性,用于传递上下文的值给子组件。 下面是一个使用原始写法和使用context hook写法的例子: 原始写法: ``` import React from 'react'; // 创建一个上下文,初始化值 const MyContext = React.createContext({name: 'twinkle', age: 18}); // 文本组件 function TextComp() { return ( <> <MyContext.Consumer> {value => ( <> <p>名字:{value.name}</p> <p>年龄:{value.age}</p> </> )} </MyContext.Consumer> </> ); } // 测试组件 export default function TestContextComp() { return ( <div> <MyContext.Provider value={{name: 'cll', age: 18}}> <TextComp/> </MyContext.Provider> </div> ); } ``` 使用context hook写法: ``` import React, { useContext } from 'react'; // 上下文数据的结构 interface ICtxP { name: string; age: number; } // 创建一个上下文 const MyContext = React.createContext<ICtxP>({ name: 'twinkle', age: 18 }); // 文本组件 function TextComp() { const value = useContext(MyContext); // 使用上下文hook return ( <> <p>名字: {value.name}</p> <p>年龄: {value.age}</p> </> ); } export default function TextContextHook() { return ( <div> <MyContext.Provider value={{ name: 'cll', age: 18 }}> <TextComp/> </MyContext.Provider> </div> ); } ``` 无论是原始写法还是使用context hook写法,它们都可以实现在React中使用上下文来共享数据。使用context hook写法可以减少代码量并简化组件的结构,使其更加简洁和易于理解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [react 进阶hook 之 context Hook](https://blog.csdn.net/qq_41499782/article/details/115493691)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值