在另一个应用程序中缺少添加控件的功能

时间:2013-08-18 11:45:39

标签: delphi

我已阅读this article如何将按钮添加到其他应用程序。当Button被添加到父应用程序时,一切似乎都没问题,但是当这个Button被添加到另一个名为Labform(TLabForm)的应用程序时,不会执行单击后的代码。我创建了一个后代来实现单击后的简单行为,但没有成功:

  TButton2 = class (TButton)
  public
    procedure Click; override;
  end;


procedure TButton2.Click;
begin
inherited;
MessageBox(ParentWindow, 'Hello', 'Window', MB_OK);
end;


procedure TForm1.btn1Click(Sender: TObject);
var
  Button2 : TButton2 ;
  Hand: THandle;
begin
   //  Hand:= FindWindow('TLabForm', 'Labform');   // button added, but SHOWS NO message after click
   Hand:= FindWindow('TForm1', 'Form1'); // button added, and SHOWS message after click
   if Hand <> 0 then
   begin
   Button2 := TButton2.Create(self);
   Button2.ParentWindow := hand;
   Button2.BringToFront;
   end
   else
   ShowMessage('handle not found');
end;

如何解决?

感谢名单

1 个答案:

答案 0 :(得分:1)

虽然技术上可以做你想做的事,但这是非常困难的。 Raymond Chen wrote about this at some length。执行摘要:

  

在不同流程的窗口之间拥有父/子或所有者/拥有关系在技术上是否合法?是的,它在技术上是合法的。在处理链锯方面技术上也是合法的。

所以,你正在尝试一些类似于杂耍链锯的困难。除非你对Win32有深刻的理解,否则你没有成功的机会。

因此,如果您想修改现有流程的GUI,并且在不同流程中使用代码无法处理,您可以做什么?那么,你需要在目标进程中执行代码。

这很容易用DLL注入。将DLL注入进程并从该DLL修改它的UI。仍然不是微不足道的。如果通过用您自己的窗口过程替换现有窗口过程来子类化窗口,那么您将获得最大的成功机会。这将允许您在UI线程中运行UI修改代码。