文件对话框求助

hwhaocool 2015-05-03 12:43:24
我在MFC里添加了一个webbrowser控件,某个网页里面有一个上传文件的按钮,我点了之后,
会弹出来一个文件对话框,我想要hook它,以便能够在网页得到这个路径之前修改这个路径值。
请教大家,有没有什么方法?
...全文
157 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2015-05-04
  • 打赏
  • 举报
回复
这个 hook 只能针对系统的 cfiledialog, 不是自己建的对话框
hwhaocool 2015-05-03
  • 打赏
  • 举报
回复
在http://ask.csdn.net/ 上,有人回答说kook GetOpenFileName, 我hook了之后,写了几行代码调试,在我写的hook函数里下断点

CFileDialog cf(TRUE,NULL,NULL,0,NULL,this); 
 cf.DoModal();
 CString strFilePath=cf.GetPathName();
GetOpenFileName(NULL);
发现前3句没有断下来,最后一句可以断下来, 那看来不是HOOK 这个GetOpenFileName API了
hwhaocool 2015-05-03
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
1 OnFileDownload() 这个是webbrowser的FileDownload事件处理函数吗 不是, 是个按钮 的 响应 不要自己再派生类了.
这个hook是不是只能针对自己建的对话框,对于不是按照你说的办法建的对话框,是不是就没有效果了?
schlafenhamster 2015-05-03
  • 打赏
  • 举报
回复
1 OnFileDownload() 这个是webbrowser的FileDownload事件处理函数吗 不是, 是个按钮 的 响应 2 cfiledialog里面有个成员结构体m_ofn,里面有个lpfnHook, 这个就是cfiledialog留给你的 hook 程序. 不要自己再派生类了.
hwhaocool 2015-05-03
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
"文件对话框" 给你一个hook机会: void CMainFrame::OnFileDownload() { // let the user selects a file name // which will be sent to a target. // TODO: Add your command handler code here char CurDir[MAX_PATH]; GetCurrentDirectory(MAX_PATH,CurDir); // if (DownLoadFileName.IsEmpty()) DownLoadFileName=RFileList->m_arrNames[0]; // if m_arrNames[0] also ="" ,then dir=CurDir; fname="" char drive[MAX_PATH]; char dir[MAX_PATH]; char fname[MAX_PATH]; char ext[10]; _splitpath(DownLoadFileName,drive,dir,fname,ext); // CFileDialog fd(TRUE); fd.m_ofn.lpstrTitle="Down Load File"; fd.m_ofn.lpstrInitialDir=strcat(drive,dir); fd.m_ofn.lpstrFile=strcat(fname,ext); fd.m_ofn.lpstrFilter="Any file(*.*)\0*.*\0ARC file (*.arc)\0*.arc\0BMP file (*.bmp)\0*.bmp\0DLL file (*.dll)\0*.dll\0"; if (stricmp(ext,".arc")==0) fd.m_ofn.nFilterIndex=2; else if (stricmp(ext,".bmp")==0) fd.m_ofn.nFilterIndex=3; else if (stricmp(ext,".dll")==0) fd.m_ofn.nFilterIndex=4; else fd.m_ofn.nFilterIndex=1; fd.m_ofn.Flags|=OFN_FILEMUSTEXIST; fd.m_ofn.Flags|=OFN_ALLOWMULTISELECT;// must fd.m_ofn.Flags|=OFN_EXPLORER; // default by Afx // fd.m_ofn.Flags|=OFN_ENABLEHOOK;// default by Afx fd.m_ofn.lpfnHook=DNHookProc;//="_AfxCommDlgProc" see"dlgcomm.cpp" <>NULL! ...... hook程序: // for CFileDialog down load // in debug version there is an error : ASSERT(m_p...==NULL) UINT CALLBACK DNHookProc(HWND hDlg,UINT uMsg,WPARAM wPar,LPARAM lPar) { // hdlg is a child HWND hWndParent; CWinApp *pApp=AfxGetApp(); HICON hIcon; HWND hw; // SHELLDll_defView HWND hcw;// SysListView32 DWORD dwStyle; // if (hDlg == NULL) return 0; // from "_AfxCommDlgProc()" of the file "dlgcomm.cpp" _AFX_THREAD_STATE* pThreadState = AfxGetThreadState(); if (pThreadState->m_pAlternateWndInit != NULL) // not pThreadState->m_pAlternateWndInit->SubclassWindow(hWnd); pThreadState->m_pAlternateWndInit = NULL; // hWndParent=GetParent(hDlg);// needed switch (uMsg) { case WM_INITDIALOG: hIcon=pApp->LoadIcon(IDI_ICONDN); SendMessage(hWndParent,WM_SETICON,(WPARAM)0,(LPARAM)hIcon); // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 DestroyIcon(hIcon); break; case WM_NOTIFY: LPOFNOTIFY lpon=(LPOFNOTIFY)lPar; UINT Notify=lpon->hdr.code; if (Notify==CDN_TYPECHANGE || Notify==CDN_SELCHANGE ) { // after window shown hw=GetDlgItem(hWndParent,0x0461);// SHELLDll_defView hcw=GetDlgItem(hw,1);// SysListView32 dwStyle=GetWindowLong(hcw,GWL_STYLE); // change multi-selection of ListView if (lpon->lpOFN->nFilterIndex==4) // "dll" { dwStyle &= ~LVS_SINGLESEL;// Multi } else { dwStyle |= LVS_SINGLESEL;// Single } SetWindowLong(hcw,GWL_STYLE,dwStyle); } if (Notify==CDN_FOLDERCHANGE) { HWND hLv=GetDlgItem(hWndParent,0x0461);//lst1 if(hLv) SendMessage(hLv,WM_COMMAND,0x7029,0);//ODM_WIEW_ICONS } break; } return 0; }
有几个问题: 1.void CMainFrame::OnFileDownload() 这个是webbrowser的FileDownload事件处理函数吗? 2.你加红部分的代码是代表,cfiledialog里面有个成员结构体m_ofn,里面有个lpfnHook,所以说这个hook只能在自己新建的 cfiledialog里实现吗?
schlafenhamster 2015-05-03
  • 打赏
  • 举报
回复
"文件对话框" 给你一个hook机会: void CMainFrame::OnFileDownload() { // let the user selects a file name // which will be sent to a target. // TODO: Add your command handler code here char CurDir[MAX_PATH]; GetCurrentDirectory(MAX_PATH,CurDir); // if (DownLoadFileName.IsEmpty()) DownLoadFileName=RFileList->m_arrNames[0]; // if m_arrNames[0] also ="" ,then dir=CurDir; fname="" char drive[MAX_PATH]; char dir[MAX_PATH]; char fname[MAX_PATH]; char ext[10]; _splitpath(DownLoadFileName,drive,dir,fname,ext); // CFileDialog fd(TRUE); fd.m_ofn.lpstrTitle="Down Load File"; fd.m_ofn.lpstrInitialDir=strcat(drive,dir); fd.m_ofn.lpstrFile=strcat(fname,ext); fd.m_ofn.lpstrFilter="Any file(*.*)\0*.*\0ARC file (*.arc)\0*.arc\0BMP file (*.bmp)\0*.bmp\0DLL file (*.dll)\0*.dll\0"; if (stricmp(ext,".arc")==0) fd.m_ofn.nFilterIndex=2; else if (stricmp(ext,".bmp")==0) fd.m_ofn.nFilterIndex=3; else if (stricmp(ext,".dll")==0) fd.m_ofn.nFilterIndex=4; else fd.m_ofn.nFilterIndex=1; fd.m_ofn.Flags|=OFN_FILEMUSTEXIST; fd.m_ofn.Flags|=OFN_ALLOWMULTISELECT;// must fd.m_ofn.Flags|=OFN_EXPLORER; // default by Afx // fd.m_ofn.Flags|=OFN_ENABLEHOOK;// default by Afx fd.m_ofn.lpfnHook=DNHookProc;//="_AfxCommDlgProc" see"dlgcomm.cpp" <>NULL! ...... hook程序: // for CFileDialog down load // in debug version there is an error : ASSERT(m_p...==NULL) UINT CALLBACK DNHookProc(HWND hDlg,UINT uMsg,WPARAM wPar,LPARAM lPar) { // hdlg is a child HWND hWndParent; CWinApp *pApp=AfxGetApp(); HICON hIcon; HWND hw; // SHELLDll_defView HWND hcw;// SysListView32 DWORD dwStyle; // if (hDlg == NULL) return 0; // from "_AfxCommDlgProc()" of the file "dlgcomm.cpp" _AFX_THREAD_STATE* pThreadState = AfxGetThreadState(); if (pThreadState->m_pAlternateWndInit != NULL) // not pThreadState->m_pAlternateWndInit->SubclassWindow(hWnd); pThreadState->m_pAlternateWndInit = NULL; // hWndParent=GetParent(hDlg);// needed switch (uMsg) { case WM_INITDIALOG: hIcon=pApp->LoadIcon(IDI_ICONDN); SendMessage(hWndParent,WM_SETICON,(WPARAM)0,(LPARAM)hIcon); // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 DestroyIcon(hIcon); break; case WM_NOTIFY: LPOFNOTIFY lpon=(LPOFNOTIFY)lPar; UINT Notify=lpon->hdr.code; if (Notify==CDN_TYPECHANGE || Notify==CDN_SELCHANGE ) { // after window shown hw=GetDlgItem(hWndParent,0x0461);// SHELLDll_defView hcw=GetDlgItem(hw,1);// SysListView32 dwStyle=GetWindowLong(hcw,GWL_STYLE); // change multi-selection of ListView if (lpon->lpOFN->nFilterIndex==4) // "dll" { dwStyle &= ~LVS_SINGLESEL;// Multi } else { dwStyle |= LVS_SINGLESEL;// Single } SetWindowLong(hcw,GWL_STYLE,dwStyle); } if (Notify==CDN_FOLDERCHANGE) { HWND hLv=GetDlgItem(hWndParent,0x0461);//lst1 if(hLv) SendMessage(hLv,WM_COMMAND,0x7029,0);//ODM_WIEW_ICONS } break; } return 0; }
 哎呀,很多人都会一不小心,就将电脑中一些重要的文件给删除了,然后到处寻找高手求助,或者自认倒霉。很多新手朋友加入电脑百事网QQ群之后都问过这样一个问题“文件不小心给删除了还找的回来吗?”WWW.PC841.COM电脑配置网,编辑这里的回答是一般可以恢复的,下面编辑就来分享下怎样恢复删除的文件。 怎样恢复删除的文件?解决方法如下: 如果仅仅只是在我的电脑中不小心删除文件(不包含U盘等可一定磁盘),然后发现错误删除了。这种情况是最好的解决的,因为在电脑中删除了文件,还会在回收站里找的到,我们只需要进入电脑桌面上得回收站里即可找到被误删的文件,如下图: 被删除的文件可以在回收站里找到 如上图笔者演示的是将笔者电脑D盘中的网站数据不小心删除了,然后我们在回收站里可以找到,如上图,我们只需要用鼠标在回收站里文件夹上右键鼠标--选择“还原”即可恢复文件到原来位置WWW.PC841.COM电脑配置网。  还有一种比较复杂的情况,那就是当我们不小心删除重要文件,开始不知道,然后对电脑进行了垃圾清理(包含清空回收站操作),那么以上方法就不可用了,因为回收站被彻底清空,这种情况要怎样恢复删除的文件呢?以下列出几种比较高级的方法,希望对菜鸟朋友有所启发与帮助。 推荐阅读:回收站清空了怎么恢复? 回收站里的文件删除了怎么恢复技巧 方法一:尝试恢复注册表来实现恢复被删除的文件 ⑴进入电脑桌面 左下脚位置 开始-运行-然后在命令框中输入注册表命令“regedit”、按回车进入注册表,如下图: 注意:windows 7用户不知道运行在哪请阅读:windows 7运行在哪文章 或阅读:怎么打开注册表 ⑵如上图,然后依次展开位置:HEKEY——LOCAL——MACHIME/SOFTWARE/microsoft/WINDOWS/ CURRENTVERSION/EXPLORER/DESKTOP/NAMESPACE 在左边空白外点击“新建”,选择:“主键”,把它命名为“645FFO40——5081——101B——9F08——00AA002F954E”如下图: 注册表编辑器修改 ⑶最后再把右边的“默认”的主键的键值设为“回收站”,然后退出注册表即可,然后我们再去被删除的地方看下文件是不是就回来了,如果没有进入回收站里查看,一般都会有,我们按照方法一,还原即可。 方法二:使用数据恢复软件EasyRecovery来恢复被删除的文件 EasyRecovery 是世界著名数据恢复公司 Ontrack 的技术杰作。其 Professioanl (专业) 版更是囊括了磁盘诊断、数据恢复、文件修复、E-mail 修复等全部 4 大类目WWW.PC841.COM电脑配置网, 19 个项目的各种数据文件修复和磁盘诊断方案。其支持的数据恢复方案包括:高级恢复—使用高级选项自定义数据恢复;普通删除恢复—查找并恢复已删除的文件。 EasyRecovery数据恢复软件 EasyRecovery Pro 6.21.04 汉化版下载点此进入>> 首先我们启动EasyRecovery,点击左边列表中的"数据修复"。数据修复里面有六个选项,我们点击"DeletedRecovery",它的功能是查找并恢复已删除的文件。选择要恢复文件所在的分区,在默认情况下软件对分区执行的是快速扫描,如果你需要对分区进行更彻底的扫描,就在"完成扫描"前打上勾就行了,选择好分区后,我们点击"下一步"。电脑收藏夹位置在哪? 如何将网址加入收藏夹! 按照提示完成即可,经过3~4分钟的扫描后结果就出来了,你点击左面文件夹列表中的文件夹,在右面列出来到文件就是能被恢复的删除文件,选择一个要恢复的文件,一定要把前面的勾打上,然后点击"下一步"。 选择好要恢复的文件后,我们就来选择恢复目标的选项,一般我们都是恢复到本地驱动器里的,那么我们点击后面的"浏览"来选择文件保存的目录(选择分区时请注意,保存的分区不能与文件原来所在的分区一样,否则不能保存)。点击下一步后,文件就开始恢复了,恢复完成后,弹出一个对话框显示文件恢复摘要,你可以进行保存或者打印,然后点击"完成"。一个文件就被恢复了。全中文界面,这里就不详细介绍了。 方法三:使用FormatRecovery来恢复被格式化磁盘文件  有的时候由于电脑硬盘被格式,那么数据相当于被彻底清空,这种情况数据要恢复一般是最复杂的,不过目前我们也可以尝试使用FormatRecovery数据恢复软件来恢复被格式化过的磁盘文件。 FormatRecovery数据恢复软件 O&O FormatRecovery V4.1.1146数据恢复软件下载点此进入 新版本FormatRecovery,为 O&O 软件提供了最终的补充,进一步丰富了数据恢复产品线。它使用相当方便,由界面上的助手指引,宽带连接慢怎么办 可以将误删除或格式化后的分区及硬盘恢复到误操作之前的状态,文件和目录信息也同样恢复。通过使用特别开发的算法,O&O FormatRecovery可以搜索整个被格式化或删除后的磁盘中的文件,然后将其恢复,即使数据严重破碎也没有问题。 怎样恢复删除的文件,方法就为大家介绍到这里,恢复方法从入门到精深,相信对于电脑爱好者学习会很不错,如果以上方法依然无法恢复您被删除的文件,并且数据非常重要,那么笔者建议一拿到专业数据恢复中心去解决。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧