修改已經開啟的對話方塊的瀏覽路徑-修改檔案屬性和尋找指定視窗

來源:互聯網
上載者:User
最近做的一個小東西要控制另外一個程式的檔案儲存對話方塊,目的是讓它只能儲存到我指定的位置,: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)
{
   ....//這裡該怎麼改呢?
}
最開始想的方法就是用鉤子截獲對話方塊開啟時的訊息,在他顯示之前改變他的墨認路徑。呵呵,不想這麼麻煩,等有時間再去試。後來從一個回帖裡找到了一種比較方便的方法。
在實際操作中,如果我們在那個檔案名稱編輯框中輸入一個目錄名,然後按確定按鈕,那個對話方塊並沒有被關閉,而是切換到那個新的目錄。通過這個方法我們就可以改已經顯示了對話方塊的瀏覽目錄。具體步驟如下:
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();
}
pedit->SendMessage(WM_SETTEXT,0,(LPARAM)filename);//發訊息還原EDIT裡的檔案名稱
delete buf; 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.