gpt4 book ai didi

delphi - 使用 DLL 注入(inject)在另一个进程中附加菜单项

转载 作者:行者123 更新时间:2023-12-02 01:05:38 26 4
gpt4 key购买 nike

我想将 dll 注入(inject)另一个进程,以便将一个项目插入该进程的主菜单并处理单击事件。

这是 DLL 文件:

library test;

uses
Winapi.Windows,
Winapi.Messages,
System.Classes,
System.Generics.Collections;

{$R *.res}


var
LSysMenu : HMenu;
OldWndProc: TFarProc;

function NewWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
case WM_COMMAND of
2000:
MessageBox(HWND_DESKTOP, 'You pressed our new menu button!', 'Yay!', MB_OK);
end;
Result := CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam);
end;

var
HwndWind:HWND;
begin
HwndWind := FindWindow(nil,PChar('Test App'));
if HwndWind <> 0 then
Begin
LSysMenu := GetMenu(HwndWind);
LSysMenu := GetSubMenu(LSysMenu, 3);
//hNewMenu := CreateMenu();
AppendMenu(LSysMenu, MF_STRING,2000, 'test');
//AppendMenu(hNewMenu, MF_STRING, 2000, 'Button');
DrawMenuBar(HwndWind);
OldWndProc := SetWindowLong(HwndWind, GWL_WNDPROC,LONG(@NewWndProc));
End;

end.

除非我注释掉该行,否则目标进程会崩溃

//OldWndProc := SetWindowLong(HwndWind, GWL_WNDPROC,LONG(@NewWndProc));

在这种情况下,新项目将被添加到菜单中,但不会调用其处理程序。

我的 NewWndProc 函数或 SetWindowLong 函数的参数有什么问题?

我的代码基于 this C++ code

最佳答案

Result := CallWindowProc(@OldWndProc, hWnd, Msg, wParam, lParam);

这里传递的是保存窗口过程地址的变量的地址。这是一种过于间接的程度。而是写:

Result := CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam);

当你让窗口过程运行时,它不会工作。你的案件陈述完全错误。请仔细阅读文档。您需要根据 WM_COMMAND 测试 Msg,并根据您的 ID 测试 wParam 的低位字。

case Msg of
WM_COMMAND:
case LoWord(wParam) of
2000:
....
end;
end;

更新 您的编辑更改了代码,使其不再可以编译。类型不匹配错误可以通过强制转换来修复:

OldWndProc := TFarProc(SetWindowLong(...));

一次更改多个内容有点令人沮丧。解决这些问题已经够困难的了,不需要瞄准一个移动的目标。

关于delphi - 使用 DLL 注入(inject)在另一个进程中附加菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24329228/

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