从 Delphi 对话框在 Windows 对话框中插入值

Insert values on Windows Dialog from Delphi Dialog

我想知道是否有办法在 Windows 本身打开的 DialogBox 中插入文件路径,但是从 Delphi 变量插入到 Windows对话?比如,在任何打开文件资源管理器对话框的网站上单击上传按钮,然后在 Delphi 中将路径值发送到网站的文件资源管理器。

PS : 我已经有了获取他的 HWND 句柄的代码。

我不知道这是否可行,或者是否有办法做到。

Edit : 来自站点的 Select 文件,我想要的只是通过 Delphi 中的应用程序变量输入该站点的文件路径.

变体

如果您已经知道对话框 window 的句柄,那么至少有 2 个变体:

  1. 使用 FindWindowEx()
  2. 通过遍历子层次结构找到控件
  3. 依赖对话框模板的 ID,使用 GetDlgItem()

两者可能都很好,但同时也很脆弱,因为对话框 window 的结构(根据其控件和 ID)甚至可以通过 Service Pack 更改,更不用说整个 Windows 版本。我在这里的经验是从 Win2000Win7 并且在这些系统上都有效。

对话框版本

您作为屏幕截图发布的是对话框的“Vista”版本; the older "Win95" version 在访问“文件名”组合框方面是相同的。

旧版是典型的,因为按钮(“打开”和“取消”)在一个 中。较旧的软件可能仍会使用这些,但您的网络浏览器很可能不会:

Vista 以来的按钮在一个 中,并且以完整的文件夹窗格为特色:

但是两张图片都显示控件布局相同:ComboBoxEx32 是 window 的直接子项,有自己的子项。所以我们可以对两个版本使用相同的代码。

代码

var
  hDialog, hCbx32, hCbx, hEdit, hFilename: HWND;
  sText: String;
begin
  hDialog:= 9568854;  // Dialog window, class "32770"
  sText:= 'M:\my\filename.ext';  // What should be set

  // Variant #1: finding the control by parents and childs.
  // Luckily both the old dialog up to XP and the new dialog
  // since Vista do not differ as per the filename ComboBox.
  hCbx32:= FindWindowEx( hDialog, 0, 'ComboBoxEx32', nil );  // Most likely the 3rd child control
  hCbx:=   FindWindowEx( hCbx32,  0, 'ComboBox',     nil );  // Actual ComboBox inside that
  hEdit:=  FindWindowEx( hCbx,    0, 'Edit',         nil );  // Edit control inside ComboBox
  SendMessage( hEdit, WM_SETTEXT, 0, LPARAM(PChar(sText)) );

  // Variant #2: using dialog template IDs, which haven't
  // changed since XP with one of its Service Packs. However,
  // tested with Win7 only.
  hFilename:= GetDlgItem( hDialog, C );  // "cmb13", found at least in XP SP3
  if hFilename= 0 then hFilename:= GetDlgItem( hDialog, 0 );  // "edt1" = Maybe prior to XP without any SP
  SendMessage( hFilename, WM_SETTEXT, 0, LPARAM(PChar(sText)) );
end;

两个变体之一应该已经完成​​。在 Win7x64

上成功测试
  • Vista 对话框版本中使用 Paint 的“打开”命令,并且
  • 我的旧程序的 Win95 对话框版本的“打开”命令之一:

文件名组合框中的文本已按预期设置。