gpt4 book ai didi

qt - 使用注入(inject)代码和 QWidget::find(hwnd) 查找第 3 方 QWidget

转载 作者:行者123 更新时间:2023-12-02 00:27:56 24 4
gpt4 key购买 nike

我有一个 Qt Dll,我使用 Windows detours 库将其注入(inject)到第三方应用程序中:

if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE, 
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL,
&si, &pi, "C:\\Program Files\\Microsoft Research\\Detours Express 2.1\\bin\\detoured.dll",
"C:\\Users\\Dave\\Documents\\Visual Studio 2008\\Projects\\XOR\\Debug\\XOR.dll", NULL))

然后我设置一个系统范围的钩子(Hook)来拦截窗口创建:

HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);

其中 XOR 是我的程序名称,Status::getInstance() 是我保存全局变量的单例。

在我的 CBTProc 回调中,我想拦截所有 QWidget 窗口:

HWND hwnd= FindWindow(L"QWidget", NULL);

效果很好,因为我得到了相应的 HWND(我用 Spy++ 检查过)然后,我想获得一个指向 QWidget 的指针,这样我就可以使用它的功能:

QWidget* q = QWidget::find(hwnd);

但问题是,返回的指针始终为 0。我是否没有正确地将代码注入(inject)到进程中?或者我没有像我应该的那样使用 QWidget::find() ?

谢谢

戴夫

编辑:如果我将 QWidget::find() 函数更改为 DLL 的导出函数,则在设置 Hook 后(以便我可以设置并捕获断点),QWidgetPrivate::mapper 为 NULL。

最佳答案

已回答:

愚蠢的错误,我是在调试中编译的,所以加载的是 QtGui4d.dll 和 QtCore4d.dll,而不是 QtCore4.dll 和 QtGui.dll

关于qt - 使用注入(inject)代码和 QWidget::find(hwnd) 查找第 3 方 QWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1173740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com