qq_39708161
EVOL4
采纳率0%
2019-02-02 22:33 阅读 1.4k

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

80

我现在需要跟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条回答 默认 最新

  • devmiao devmiao 2019-02-02 23:55
  • qq_39708161 EVOL4 2019-02-19 11:41

    最近自己研究了一下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有点难用...)

    点赞 评论 复制链接分享

相关推荐