修改已经打开的对话框的浏览路径

迁之安达

迁之安达

2016-02-19 13:56

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的修改已经打开的对话框的浏览路径,希望大家看完后能赶快学习起来。

最近做的一个小东西要控制另外一个程序的文件保存对话框,目的是让它只能保存到我指定的位置,:P,我要控制保存的数据。
   我们知道用CFileDialog很容易设置对话框的初始浏览路径,只要在CFileDialog类的OPENFILENAME结构里用自己的目录改变lpstrInitialDir就可以了:
CFileDialog dlg;
dlg.m_ofn.lpstrInitialDir="c:WINDOWS";//这里设置对话框的浏览目录
dlg.DoModal();
可我要控制的是一个已经显示的对话框,这个时候再用m_ofn.lpstrInitialDir来设置就没有效果啦!我通过FindWindow找到了这个对话框的句柄,
CWnd * pWnd = FindWindow(NULL,"另存为");
 if(pWnd)
{
   ....//这里该怎么改呢?
}
最开始想的方法就是用钩子截获对话框打开时的消息,在他显示之前改变他的墨认路径。呵呵,不想这么麻烦,等有时间再去试。后来从一个回帖里找到了一种比较方便的方法。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

在实际操作中,如果我们在那个文件名编辑框中输入一个目录名,然后按确定按钮,那个对话框并没有被关闭,而是切换到那个新的目录。通过这个方法我们就可以改已经显示了对话框的浏览目录。具体步骤如下:
1、首先保存那个文件名编辑框的值
2、在那个编辑框中设置新的目录名
3、模拟鼠标单击“确定”按钮,这时候对话框切换到新的目录
4、恢复原来编辑框的值

这里还需要注意的一点就是第二步设置目录的时候要发送WM_SETTEXT消息,而不能直接用SetWindowText函数,因为它在跨进程使用的时候有问题,没有效果。
下面是部分关键代码:
CWnd * pWnd = FindWindow(NULL,"另存为");
CString sCtrlName;
CWnd *pedit;
CString filename;
TCHAR BUF[512];
if(pWnd)
{
     CWnd *pwnd=pWnd-GetWindow(GW_CHILD);//枚举保存对话框的所有子控件
     char *buf=new char[512];
     while(pwnd!=NULL)
    {
         ::GetClassName(pwnd-GetSafeHwnd(),buf,512);//得到枚举的控件是什么类型的,
         CString str=buf;  
         str.TrimRight();          
         if(str=="Edit")//如果枚举到保存文件名的EDIT
        {
            pedit=pwnd;//保存EDIT句柄用来发消息
            pwnd-SendMessage(WM_GETTEXT,sizeof(BUF)/sizeof(TCHAR),(LPARAM)(void*)BUF);
            filename=BUF;//完成第一步保存原始的文件名
        }
        if(str=="Button")//枚举到按钮,有保存和取消按钮
       {
            pwnd-SendMessage(WM_GETTEXT,sizeof(BUF)/sizeof(TCHAR),(LPARAM)(void*)BUF);
            //发消息得到按钮的标题
            CString str=BUF;
            str.TrimRight();
            if(str=="保存(&S)")//如果是保存按钮
            {  
               lstrcpy(BUF,(LPCTSTR)sPath);//sPath表示我们要设置的对话框浏览目录
               //发消息设置文件名EDIT为我们的路径名,完成第二步
               pedit-SendMessage(WM_SETTEXT,0,(LPARAM)BUF);
               //发消息模拟点击保存按钮,完成第三步
               ::SendMessage(pwnd-GetSafeHwnd(),WM_LBUTTONDOWN,0,0);
               ::SendMessage(pwnd-GetSafeHwnd(),WM_LBUTTONUP,0,0);
            }
        }
    }
     pwnd = pwnd-GetNextWindow();
}
//发消息还原EDIT里的文件名,完工!
pedit-SendMessage(WM_SETTEXT,0,(LPARAM)filename);
delete buf;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

修改已经打开的对话框的浏览路径

编程语言 网络编程
修改已经打开的对话框的浏览路径

打开windows运行对话框的js

Web开发
打开windows运行对话框的js

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

改变打开对话框中"打开"按钮的标题

编程语言 网络编程
改变打开对话框中

改变打开对话框中打开按钮的标题

编程语言 网络编程
改变打开对话框中打开按钮的标题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

360极速浏览器打开清除浏览数据对话框的方法

浏览器
360极速浏览器打开清除浏览数据对话框的方法

vc的对话框-

编程语言 网络编程
vc的对话框-

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Visual C++小技巧:实现透明窗体

Visual C++小技巧:实现透明窗体

王坤闓始,某╯年,某时、 - QQ伤感分组

王坤闓始,某╯年,某时、 - QQ伤感分组
下拉加载更多内容 ↓