Delphi 处理添加到其他应用程序的按钮的onclick

Delphi 处理添加到其他应用程序的按钮的onclick,delphi,Delphi,我正在向另一个应用程序添加一个按钮。这是一个第三方应用程序,我没有访问源代码的权限,并希望向其添加一些功能 我添加了如下按钮 var oButton : Tbutton; begin oButton := TButton.Create(self); oButton.OnClick := oButtonClick; //defined elsewhere oButton.caption := 'Button1'; oButton.ParentWindow := hand; // h

我正在向另一个应用程序添加一个按钮。这是一个第三方应用程序,我没有访问源代码的权限,并希望向其添加一些功能

我添加了如下按钮

var
  oButton : Tbutton;
begin
 oButton := TButton.Create(self);
 oButton.OnClick :=  oButtonClick;  //defined elsewhere
 oButton.caption := 'Button1';
 oButton.ParentWindow := hand; // hand := handle of a toolbar from another app
end;
这一切都很好,按钮被添加到其他应用程序的任务栏

当我点击按钮时,我得到一个


xxxxxx


模块“xxxxxxxx.exe”中地址00558183处的访问冲突。阅读地址00000278。 好啊 为什么我会遇到访问冲突,以及如何使onclick事件触发

无论是否定义onlick事件,我都会遇到这种访问冲突,并且它根本不执行onclick事件

我在按钮上添加了一个弹出菜单,效果很好。我可以右键点击按钮,我得到菜单,并选择一个项目,这是可行的

编辑:在确定这不是一个好办法之后。我使用了这里发布的方法:


可以满足我的需要。

您正在自己的进程中创建
TButton
对象,并将其内部
HWND
附加到另一个进程中运行的父进程
HWND
。这是行不通的。首先,
hwnd
具有线程关联性。它们只在创建它们的线程中运行,并且只有该线程才能为它们接收消息。您的按钮的
HWND
和父按钮的
HWND
正在不同的线程中创建。不是一个好的组合。陈雷蒙在他的博客中提到了这个问题:


为了安全地执行您要求的操作,您可能必须将代码注入到另一个进程(
CreateRemoteThread()
,等等)中,以对父级
HWND
本身进行子类化,这样您就可以创建按钮
HWND
(而不是
TButton
对象!)在与父进程
HWND
相同的线程中,并在该线程中处理按钮的消息,所有消息都在另一个进程的地址空间内,而不是在您的进程中。当用户单击按钮时,它可以使用您选择的IPC机制(窗口消息、命名管道、邮箱等)根据需要将信息转发回您的应用程序。

为什么您认为您可以任意将控件添加到不同的应用程序中,它们会神奇地工作?这是行不通的。就像我说的,这个按钮被添加到另一个应用程序中,如果我在按钮上添加一个弹出菜单,它就会工作。因此,从技术上讲,我可以使用这种方法来做我想做的事情,让用户右键单击按钮并从菜单中选择一个项目。这并不理想,宁愿让onclick事件工作。我的问题是,为什么弹出菜单能工作,而onclick不能。为什么它不能工作?为什么要这样做?跨进程UI和一些毫无戒心的受害者进程是不可能工作的。谁否决了我,我能知道为什么吗?这样我下次提问时就不会犯同样的错误。谢谢雷米回答我的问题。我正在我的主应用程序线程中创建按钮,我只是将它附加到另一个窗口。我仍然希望delphi程序的主线程处理onclick事件。我的目标只是将按钮附加到另一个应用程序,以便轻松访问我的Delphi程序。“我正在我的主应用程序线程中创建按钮。我只是将其附加到另一个窗口”-这就是问题所在。不要这样做,尤其是当其他应用程序不是为配合您的应用程序而设计时。“我仍然希望delphi程序的主线程处理onclick事件”-您不能直接这样做。您需要挂接其他应用程序,并将单击从其他进程委派给您的进程。“我的目标只是将按钮附加到另一个应用程序上,以便轻松访问我的Delphi程序。”-跨进程UI交互并不容易。