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