任何抛出Handle的方法?

时间:2012-06-02 17:48:09

标签: windows delphi casting handle

美好的一天,

我有不同的非VLC对象的不同句柄,如(SysListView32,ToolbarWin32),我想知道是否有任何方法来转换这些句柄(HWND)。

例如,我得到了启动按钮(位于桌面左下方)的句柄。然后我找到了班级名称“按钮”。

我想投他并从他那里取回标题属性“start”。例如:

type 
  TButtonStartMenuFictiveClass = class(TButton)
  public
    Text: string;
  end;

if classname = 'button' then
begin
  ShowMessage((objecthandle as TButtonStartMenuFictiveClass).Text);
end;

我希望挂钩所有对象并显示它们的文本。就像Windows的叙述者一样。

2 个答案:

答案 0 :(得分:2)

正如我在previous question中解释的那样,您需要使用Windows API来访问外部窗口控件的属性。您不能简单地将窗口句柄转换为对象。它们不是指向Delphi对象的指针。

我链接的示例不仅显示了您正在悬停的控件的类名,还显示了控件的标题(文本)。这个功能也可以解决问题:

function GetWndText(const Handle: Hwnd): string;
var
  Len: Integer;
begin
  Len := GetWindowTextLength(Handle) + 1;
  SetLength(Result, Len);
  GetWindowText(Handle, PChar(Result), Len);
end;

答案 1 :(得分:2)

在某些情况下,您可以实例化VCL对象并将外部HWND分配给其WindowHandle属性,例如:

var
  S: String;

with TButton.Create(nil) do
try
  WindowHandle := TheButtonWnd;
  try
    S := Caption;
  finally
    WindowHandle := 0; // important
  end;
finally
  Free;
end;