从 Delphi 对话框在 Windows 对话框中插入值
Insert values on Windows Dialog from Delphi Dialog
我想知道是否有办法在 Windows 本身打开的 DialogBox 中插入文件路径,但是从 Delphi 变量插入到 Windows对话?比如,在任何打开文件资源管理器对话框的网站上单击上传按钮,然后在 Delphi 中将路径值发送到网站的文件资源管理器。
PS : 我已经有了获取他的 HWND
句柄的代码。
我不知道这是否可行,或者是否有办法做到。
Edit : 来自站点的 Select 文件,我想要的只是通过 Delphi 中的应用程序变量输入该站点的文件路径.
变体
如果您已经知道对话框 window 的句柄,那么至少有 2 个变体:
- 使用
FindWindowEx()
通过遍历子层次结构找到控件
- 依赖对话框模板的 ID,使用
GetDlgItem()
两者可能都很好,但同时也很脆弱,因为对话框 window 的结构(根据其控件和 ID)甚至可以通过 Service Pack 更改,更不用说整个 Windows 版本。我在这里的经验是从 Win2000 到 Win7 并且在这些系统上都有效。
对话框版本
您作为屏幕截图发布的是对话框的“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 对话框版本的“打开”命令之一:
文件名组合框中的文本已按预期设置。
我想知道是否有办法在 Windows 本身打开的 DialogBox 中插入文件路径,但是从 Delphi 变量插入到 Windows对话?比如,在任何打开文件资源管理器对话框的网站上单击上传按钮,然后在 Delphi 中将路径值发送到网站的文件资源管理器。
PS : 我已经有了获取他的 HWND
句柄的代码。
我不知道这是否可行,或者是否有办法做到。
Edit : 来自站点的 Select 文件,我想要的只是通过 Delphi 中的应用程序变量输入该站点的文件路径.
变体
如果您已经知道对话框 window 的句柄,那么至少有 2 个变体:
- 使用
FindWindowEx()
通过遍历子层次结构找到控件
- 依赖对话框模板的 ID,使用
GetDlgItem()
两者可能都很好,但同时也很脆弱,因为对话框 window 的结构(根据其控件和 ID)甚至可以通过 Service Pack 更改,更不用说整个 Windows 版本。我在这里的经验是从 Win2000 到 Win7 并且在这些系统上都有效。
对话框版本
您作为屏幕截图发布的是对话框的“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 对话框版本的“打开”命令之一:
文件名组合框中的文本已按预期设置。