从对话框句柄获取控件ID

时间:2015-10-07 13:10:16

标签: windows winapi visual-c++ dialog

我有一个对话框句柄。我想在对话框的输入中获取文本。我可以使用GetDlgItemText()函数来获取文本。但我必须将字段的控件ID作为参数。那么我应该如何找到字段的控件ID(我需要的字段是"新密码"在更改密码对话框中)。

3 个答案:

答案 0 :(得分:2)

当您没有控件的ID时,唯一的选择是枚举对话框(或窗口)的所有子窗口并获取子窗口的类型。您可以使用EnumChildWindows()函数枚举所有子窗口。

在枚举回调中,您将拥有每个子控件的HWND。使用GetClassName()获取孩子的类型并查看它是否为EDIT,如果是,那么您必须确定这是否是您想要的子控件。

答案 1 :(得分:0)

使用GetWindowLongPtr()获取哪个窗口处于活动状态的ID。然后使用GetDlgItem()在同一个mdi窗口proc上控制该窗口 示例:如果您使用多个mdi子窗口。然后你控制另一个mdi子窗口,例如你想从激活mdi窗口50003在mdi窗口ID 50000上绘制文本。 然后把GetWindowLongPtr(hwnd,GWLP_ID)。将它保存为int值,例如,从此激活获得的id为50000。然后你把GetDlgItem(hwnd,50000)放到句柄窗口id 50000,然后绘制一些文本winapi函数。然后输出将是您想要在点击激活的mdi窗口id 50003上在mdi窗口ID 50000上绘制的文本。希望这可以解决您的问题。

答案 2 :(得分:0)

FindDlgFileNameID 的内容:

var
  lp,fn_ID:integer;

function EnumChildProcess(hHwnd: HWND; var lParam: integer): boolean; stdcall;
var
  ClassName: string;
begin
  if (hHwnd=0) then
    result := false
  else begin
    SetLength(ClassName, 255);
    SetLength(ClassName,GetClassName(hHwnd,PChar(className),Length(className)));

    if Classname<>'Edit' then begin
      Result:=true;
      exit
    end;

    fn_ID:=GetDlgCtrlID(hHwnd);
    Result := false;
  end;
end;

function FindDlgFileNameID(hDialog:HWND):integer;
begin
  lp := 0; fn_ID := 0;
  EnumChildWindows(hDialog, @EnumChildProcess, integer(@lp));
  Result := fn_ID;
end;

这里的 hDialog 是父级的句柄: hDialog := GetParent(Self.Handle);