【问题标题】:Missing functionality of added Control in another application在另一个应用程序中缺少添加控件的功能
【发布时间】:2013-08-18 11:45:39
【问题描述】:

我已阅读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;

如何解决?

感谢

【问题讨论】:

    标签: delphi


    【解决方案1】:

    虽然技术上可以做你想做的事,但它非常困难。陈雷蒙德wrote about this at some length。执行摘要:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多