【问题标题】:Get control ids from dialog box handle从对话框句柄获取控件 ID
【发布时间】:2015-10-07 13:10:15
【问题描述】:

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

【问题讨论】:

  • GetDlgCtrlID()。或者更好的是,使用SendMessage(hwnd, WM_GETTEXT, textLen + 1, (LPARAM)buffer);
  • 我检查过了。我必须将控件的句柄作为参数提供给 GetDlgCtrlID() 函数。如果我必须从对话框句柄中获取控制句柄,我可以使用 GetDlgItem() 函数,该函数再次需要控件 ID 作为参数。所以我不知道该怎么办。
  • 我添加“winlogon”作为标签的原因是在那种情况下会出现更改密码对话框。有一些方法(VS中的spy++)可以找到普通对话框的控件ID(保存在记事本中)。在这种情况下我也无法使用它
  • 澄清一下,您想从对话框窗口中的某个编辑框中获取文本,而您拥有的唯一标识符就是它的句柄,对吧?
  • 是的。该对话框是更改密码对话框,我需要的字段是“新密码”。我在问题的最后一行提到了它。

标签: windows winapi visual-c++ dialog


【解决方案1】:

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

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

【讨论】:

  • 另一种选择是使用FindWindowEx() 循环而不是EnumChildWindows()。这样,您可以将EDIT 指定为lpszClass 参数,这样它就只返回EDIT 子窗口。
【解决方案2】:

使用 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 上绘制的文本。希望这可以解决您的问题。

【讨论】:

  • 您好,欢迎来到 Stack Overflow。请格式化您的答案,使其易于理解。
【解决方案3】:

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是parent的句柄:hDialog := GetParent(Self.Handle);

【讨论】:

  • 请注意,该问题使用 [visual-c++] 标记。因此,尽管这个(Pascal?)答案可能会有所帮助,但如果您可以提供代码的 C++ 版本,那就更好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
相关资源
最近更新 更多