MFC钩子问题 我想点击一个按钮 d出一个对话框 然后用钩子函数修改消息,点击之后d出另一个dui对话框

MFC钩子问题 我想点击一个按钮 d出一个对话框 然后用钩子函数修改消息,点击之后d出另一个dui对话框,第1张

你的这个问题用API HOOK 不太合适。

这种模式是采用子类化比较合适。

可以在父窗口中拦截BN_CLICKED 消息进行处理。

实现方式:谨州

1、创建一个基于CWnd /(ATL CWindow)的类,实现BN_CLICKED事件的拦截处理。

2、实例化你创建肆首的这个类,查找到按钮的父窗口,然后调用调用类方法SubclassWIndow() 子类化父窗口就可以了。

3、如果是跨进程的远程子类化,需要你将这个类编译成一个DLL,然后通过钩子或CreateRemoteThread() 将这个DLL注入到目标进程,然后执行第一二部就可以了。

以ATL 示例

#include <atlbase.h>

#include <atlwin.h>

class CX : public CWindowImpl<CX>

{

public:

BEGIN_MSG_MAP(CX)

COMMAND_CODE_HANDLER(BN_CLICKED,OnBtnClicked)

END_MSG_MAP()

LRESULT OnBtnClicked(WORD , WORD wID, HWND , BOOL bHandled)

{

bHandled = FALSE// 可以执行默认的WM_COMMAND 消息

if (wID == 你需要子类化的窗口控件ID)

{

// 调用你要改变的对话框,这块自己处理

CXXDlg dlg

dlg.DoModel()

bHandled = TRUE // 阻止消息的默认处理

}

return 0

}

}

挂接示例

static CX* g_pWnd = NULL

// 查找按祥雹蔽钮的父窗口

// 如果父窗口有效则执行子类化,挂接你的子类化处理。

HWND hBtnParent = FindWIndow(xxxx)

if (!g_pWnd &&IsWindow(hBtnParent))

{

g_pWnd = new CX

g_pWnd = g_pWnd.SubclassWindow(hBtnParent)// 子类化父窗口

}

如果是远程子类化,需要你进行注入,这个过程你可以从网上搜索相关资料

这个示例是在页面中敲的,没有经过测试,大体流程就是这样,你可以依据的具体情况进行调整

系统铅碰中有很多钩子, 是没渣一个链, 钩子链, 你捕获了消息处理后, 要把消息重新发回到枯激悄钩子链中: CallNextWindowsHookEx 好像是这个函数, 以便其它程序捕获, 如果你要拦截这个消息, 则不执行这个 *** 作, 直接返回.

* 鼠标和键盘不能都锁定吧,否则用什么来重新打开屏幕啊

* 低级钩子的方法隐敏卖是不行的。系统底层(驱动层)收到输入灶逗就开启屏幕了。之后才会调用低级钩子。所以低级钩子拦截是没用的。

* 如果你的系统是professional的,好像在鼠标的驱动配置里面(设备管理器)电源管理里面可以配置鼠标不唤醒。

* 可以是usb鼠标,可以考虑关屏幕后卸载掉这个usb设备。这样鼠标就不会触发了。之后开屏再重启这个usb设备

* 我看过一款关屏幕软件确实做到关闭屏幕拿薯后鼠标不会从开屏幕的。但不知道它是用什么原理


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8261994.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存