Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 从对话框句柄获取控件ID_Windows_Winapi_Visual C++_Dialog - Fatal编程技术网

Windows 从对话框句柄获取控件ID

Windows 从对话框句柄获取控件ID,windows,winapi,visual-c++,dialog,Windows,Winapi,Visual C++,Dialog,我有一个对话框句柄。我想在对话框的输入中获取文本。我可以使用GetDlgItemText()函数来获取文本。但我必须给出字段的控件ID作为参数。因此,我应该如何找到字段的控件ID(我需要的字段是“更改密码”对话框中的“新密码”)当您没有控件ID时,唯一的选项是枚举对话框(或窗口)的所有子窗口并获取子窗口的类型。您可以使用EnumChildWindows()函数枚举所有子窗口 在枚举回调中,您将拥有每个子控件的HWND。使用GetClassName()获取子控件的类型,并查看它是否为EDIT,如果

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

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

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

使用GetWindowLongPtr()获取激活窗口的ID。然后使用GetDlgItem()在同一mdi窗口进程上控制该窗口 示例:如果使用多个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上绘制的文本。希望这能解决您的问题。

这是为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;
var
lp,fn_ID:整数;
函数EnumChildProcess(hHwnd:HWND;var lParam:integer):布尔;stdcall;
变量
类名:string;
开始
如果(hHwnd=0),则
结果:=假
否则开始
SetLength(类名称,255);
SetLength(ClassName,GetClassName(hHwnd,PChar(ClassName),Length(ClassName));
如果类名为“编辑”,则开始
结果:=真;
出口
终止
fn_ID:=GetDlgCtrlID(hHwnd);
结果:=假;
终止
终止
函数FindDlgFileNameID(hDialog:HWND):整数;
开始
lp:=0;fn_ID:=0;
EnumChildWindows(hDialog,@EnumChildProcess,整数(@lp));
结果:=fn_ID;
终止

这里的hDialog是parent:hDialog:=GetParent(Self.handle)的句柄

。或者更好地使用
SendMessage(hwnd,WM_GETTEXT,textLen+1,(LPARAM)缓冲区)我查过了。我必须将控件的句柄作为参数提供给GetDlgCtrlID()函数。如果必须从对话框句柄获取控件句柄,则可以使用GetDlgItem()函数,该函数再次需要控件ID作为参数。所以我不知道该怎么办。我添加“winlogon”作为标记的原因是,在这种情况下会出现更改密码对话框。有一些方法(VS中的spy++)可以找到普通对话框(保存在记事本中)的控件ID。我不能在这个场景中使用它,只是为了澄清一下,你想从对话框中的某个编辑框中获取文本,你得到的唯一标识符是它的句柄,对吗?是的。对话框是“更改密码”对话框,我需要的字段是“新密码”。我在问题的最后一行提到了它。另一种选择是使用
FindWindowEx()
循环,而不是
EnumChildWindows()
。这样,您可以指定
EDIT
作为
lpszClass
参数,这样它只返回
EDIT
子窗口。您好,欢迎使用堆栈溢出。请格式化您的答案,使其易于理解和理解。请注意,该问题标有[visual c++]。因此,尽管这个(Pascal?)的答案可能会有帮助,但如果你能提供C++代码的版本,那就更好了。