Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
Delphi 如何获得Vista样式打开/保存对话框的句柄?_Delphi_Handle_Topendialog_Tsavedialog - Fatal编程技术网

Delphi 如何获得Vista样式打开/保存对话框的句柄?

Delphi 如何获得Vista样式打开/保存对话框的句柄?,delphi,handle,topendialog,tsavedialog,Delphi,Handle,Topendialog,Tsavedialog,我想获得Delphi应用程序打开的新vista样式的打开/保存对话框的窗口句柄 通过解析OnShow,旧样式对话框是可能的,但在新样式对话框中没有这样的事件 是否有可能遍历Windows中的所有窗口句柄并以这种方式获得它 谢谢 编辑:我知道OpenDialog.Handle将返回句柄,但仅当对话框可见时返回(否则为0)。在显示对话框后,我需要一个事件来直接捕获句柄(无需任何用户操作,例如:在对话框中选择一项、更改文件类型等) 我想获得Delphi应用程序打开的新vista样式的打开/保存对话框

我想获得Delphi应用程序打开的新vista样式的打开/保存对话框的窗口句柄

通过解析OnShow,旧样式对话框是可能的,但在新样式对话框中没有这样的事件

是否有可能遍历Windows中的所有窗口句柄并以这种方式获得它

谢谢


编辑:我知道OpenDialog.Handle将返回句柄,但仅当对话框可见时返回(否则为0)。在显示对话框后,我需要一个事件来直接捕获句柄(无需任何用户操作,例如:在对话框中选择一项、更改文件类型等)

我想获得Delphi应用程序打开的新vista样式的打开/保存对话框的窗口句柄

这可以通过对话框的
句柄
属性获得


捕获对话框显示事件的最简单方法可能是使用在显示对话框之前立即设置的CBT挂钩,并在对话框关闭后立即删除。

TopEndDialog有一个OnShow事件,该事件在显示对话框后立即触发,因此您可以使用该事件获取OpenDialog.Handle,因为此时已设置了该句柄


编辑:在一些人指出使用OnShow事件会改变对话框的外观后,我测试了这一点,可以确认使用OnShow事件确实会改变对话框的外观。

关于
句柄属性如何?@Steve你打算如何处理句柄?正如@TLama所说,您可以通过
handle
属性获得句柄,但我关心的是您接下来要做什么?是否要自定义对话框?应使用接口进行自定义。David,如果在执行对话框之前尝试获取句柄,则为0。据我所知,在显示对话框后,没有事件可以直接获取句柄。我想在特殊情况下获得将对话框窗口置于顶部的句柄。你能通过正确设置父窗口来修复它吗?FWIW,我想你问错了问题。我认为您需要使用
句柄
,但也需要在创建窗口时查找通知,以便您可以使用句柄执行某些操作。也许如果您编辑了这个问题,我们也可以讨论一下。不,一旦您将处理程序附加到
OnShow
事件,它就不再是“Vista风格的对话框”。您的意思是什么?我看不出有任何区别,如果我理解TopEndDialog源代码,那么就不应该有任何区别。如果将处理程序附加到Show
上,则应该看到explorer样式的对话框。有关源代码,请参阅
TOpenDialog.DoExecute
中的代码,请参阅第一个“if”测试。附加
FOnShow
时,不会执行FileDialogWrapper,而是调用
GetOpenFileName
。但是不管怎样,视觉上的差异是非常明显的,一个是,另一个是。此外,这也是问题的原因,问题中也提到了OnShow。当我在OnShow事件中进行处理能力的qick测试时,我总是以打开对话框结束,如您链接的第二张图片所示。也许这是因为我使用的是Windows7而不是WindowsVista。当我回到家的时候,我会测试它。Windows7不重要,它也使用Vista风格的对话框,IFileOpenDialog。我相信您在测试时一定做错了什么,因为
IFileDialog
根本不支持像旧对话框那样的回调。看看它支持什么。