如何与windows的打开/保存文件对话框的交互 80C

我现在需要跟windows,**任何程序**创建的save/open 文件对话框进行交互,根据msdn所说
链接:


从vista开始,提供了IFileDIalog接口来替代以前的GetOpenFileName等方法


但是这些api还是可用的,只是这些api显示的窗口与IFileDialog显示出的窗口风格不一样


我现在的需求就是
1. 不管是用GetOpenFileName() 等api还是iFIleDialog接口,当一个文件对话框存在时,我的程序怎样才能定位到它呢(最好能获得它的HWND)
2. 假设我有一文件路径,如C:\MyFolder,我该怎样让某个文件对话框定位到这个文件夹呢


我自己研究了两天,关于第一点,我想通过SetWindowsHookEx过滤WM_INITDIALOG消息解决,但我没办法判断新创建的对话框是不是文件对话框,而且已经创建完毕的文件对话框也不能这样定位



关于第二点,我发现iFIleDialog->setFolder() 可以让一个已经打开的文件dialog定位到目标文件夹,但首先我得能获得目标对话框对应的iFIleDialog接口才行,对com接口编程我不是很熟悉

2个回答

qq_39708161
EVOL4 谢谢回复,但我是希望能与别人打开的文件选择窗口进行交互,不是自己去打开一个哪
一年多之前 回复

最近自己研究了一下MSDN的IFileDialog相关的文档IFileDialogEvents
,觉得使用COM Hook 可以解决这个问题,步骤如下:




1.使用SetWindowsHookEX向所有进程注入我的DLL



2.可以HOOK的接口有IFileOpenDialog和IFileSaveDialog两种,对应的CLSID分别为CLSID_FileOpenDialog和CLSID_FileSaveDialog



3.两个接口都派生自IFileDialog接口



4.在DLL中Hook住 IFileDialog->Advice(IFileDialogEvents*, DWORD *)



5.在HOOK_Advice中传入自己实现的IFileDialogEvents接口,这样一来IFileDialog和IFileDialogEvents都可以由我们来操作


6.比如想要让打开的IFileDialog窗口定位到某个目录,可以调用IFileDialog->SetFolder(IShellItem *folder)来实现


7.可以通过IFileDialog接口调用IOleWindow->GetWIndow(HWND*)来获得获得目标窗口句柄


上面只是思路,具体实现等我搞定了会再更新的,最后还是要感谢各位的回答,没接触过COM编程还是脑壳疼(PS:这csdn的MarkDown有点难用...)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问