【问题标题】:Create Button on other application window在其他应用程序窗口上创建按钮
【发布时间】:2011-06-18 06:24:55
【问题描述】:

我写了下面的代码来在计算器上创建一个额外的按钮,但按钮不显示:

var
  Object1 : TButton ;
  Hand: THandle;
begin
   Hand:= FindWindow('CalcFrame', 'Calculator');
   Object1 := TButton.CreateParented(Hand);
   Object1.Show ;
end;

我使用EnumChildWindow API函数运行上述代码后得到计算器上的控件,在EnumChildWindow返回的控件列表中看到创建的按钮,但是为什么创建的按钮不显示?

我记得我在 Windows XP 上使用此代码,它可以正常工作,但现在在 Windows 7 中,创建的按钮不会出现。

【问题讨论】:

  • 我猜计算器不使用窗口控件,所以它会自己绘制,只是忽略你在绘制处理程序中的冒名顶替者。
  • 但是这段代码并没有在其他APP上创建按钮!

标签: delphi cross-application


【解决方案1】:

Win7中的计算器和画图是 使用 .NET 和 WPF 重建,以及 没有办法“联系” .NET 代码通过本机代码 特别是使用不同的 WPF 绘制其控件的方法。

编辑: 使您的代码适用于本机 您可以使用如下代码的应用程序:

hand := FindWindow('TForm1','Form1');
object1 := TButton.Create(self);
object1.ParentWindow := hand;

【讨论】:

  • Issam,我认为这不是真的,如果您使用 winspy 并深入研究paint 和 calc,您会发现您可以获取其中每个控件的句柄,这与您构建时的情况不同使用 winforms 或 WPF。
  • @Mohammad 我找不到来自 MS 的关于这个问题的官方文件,但有一些页面像这样谈论它:social.msdn.microsoft.com/Forums/en/wpf/thread/… 也许 SO 中的 MS 家伙可以告诉我们关于这个问题的真相这个题目,还是他们会认为是主观题?你怎么看? ;)
【解决方案2】:

你必须让Visible:= False

var
  Hand: THandle;
  Object1: TButton;
begin
  Hand:= FindWindow('TForm1', 'Form1');
  if Hand <> 0 then
  begin
    Object1:= TButton.CreateParented(Hand);
    Object1.Caption:= 'Test';
    Object1.Visible:= False ;
    Object1.Show;
  end;
end;

【讨论】:

    猜你喜欢
    • 2014-07-19
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2019-09-19
    • 2015-03-15
    • 2015-09-29
    相关资源
    最近更新 更多