-1

我已阅读这篇文章如何将按钮添加到另一个应用程序。当 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;

如何解决?

谢谢

4

1 回答 1

1

虽然在技术上可以做你想做的事,但这是极其困难的。Raymond Chen详细地写了这篇文章。执行摘要:

在不同进程的窗口之间建立父/子或所有者/拥有关系在技术上是否合法?是的,这在技术上是合法的。使用电锯在技术上也是合法的。

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

因此,如果您想修改现有流程的 GUI,并且使用不同流程中的代码进行修改并不容易,您可以做什么?好吧,因此您需要在目标进程内执行代码。

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

于 2013-08-18T12:25:37.353 回答