请问如何通过已知的控件句柄,获得该控件的父窗体句柄

longyuance 2015-09-01 04:41:15

我用WindowFromPoint这个函数得到了某程序中listview的句柄,有没有什么方法通过该句柄得到父窗体的句柄吗?
...全文
543 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
longyuance 2015-09-02
  • 打赏
  • 举报
回复
太感谢二位了,特别感谢lyhoo163,你的答案让我获益匪浅
lyhoo163 2015-09-01
  • 打赏
  • 举报
回复
一、这段代码是获取ListView1的父控件

var HWND:THandle;
begin
  HWND := GetParent(ListView1.Handle);
  ShowMessage(IntToStr(HWND));
end;
二、这段代码是获取ListView1的窗体的句柄
var HWND: THandle;
begin
  HWND := GetParent(ListViewfilelocal.Handle);
  while GetParent(HWND)<>0 do  // 找到最高的父控件
    HWND:=GetParent(HWND); 
  ShowMessage(IntToStr(HWND));
end;
三、这段代码是获取ListView1的窗体的实体(名称)

function GetInstanceFromhWnd(const hWnd: Cardinal): TWinControl;
type
  PObjectInstance = ^TObjectInstance;

  TObjectInstance = packed record
    Code: Byte;            //  短跳转 $E8
    Offset: Integer;       //  CalcJmpOffset(Instance, @Block^.Code);
    Next: PObjectInstance; //  MainWndProc 地址 }
    Self: Pointer;         //  控件对象地址 }
  end;
var
  wc: PObjectInstance;
begin
  Result := nil;
  wc     := Pointer(GetWindowLong(hWnd, GWL_WNDPROC));
  if wc <> nil then
    Result := wc.Self;
end;

procedure TMain.ListView1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  HWND: THandle;

begin
  HWND := GetParent(ListViewfilelocal.Handle);
  while GetParent(HWND)<>0 do   // 找到最高的父控件
    HWND:=GetParent(HWND);
  ShowMessage(GetInstanceFromhWnd(HWND).Name);
end;
应该很明白了。
缘中人 2015-09-01
  • 打赏
  • 举报
回复
HWND ParentHandle;
ParentHandle := GetParent(hp);

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧