最近做的一個小東西要控制另外一個程序的文件保存對話框,目的是讓它只能保存到我指定的位置,: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;
|