請問如何讓openDialog元件,開啟時看不到隱藏目錄 |
答題得分者是:RootKit
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
我主要是要用在單檔存檔跟多檔匯出的功能上,設定你說的那個屬性無效。
單檔存檔用TSaveDialog,已可以把我不顯示的資料夾去除掉。 [code delphi] procedure TFormMain.SaveDlgIncludeItem(const OFN: TOFNotifyEx; var Include: Boolean); var sr : STRRET; FileName : string; IDL:PItemIDList; begin Include:=true; ofn.psf.GetDisplayNameOf(ofn.pidl, SHGDN_FORPARSING, sr); case sr.uType of STRRET_CSTR : FileName := sr.cStr; STRRET_WSTR : FileName := sr.pOleStr; STRRET_OFFSET : FileName := PChar(Cardinal(ofn.pidl) sr.uOffset); end; IDL:=ofn.pidl; if (FileName=g_WindowsDirectory '\Log') then begin Include:=false; // try IDL^.mkid.abID[0]:=0; except end; end; end; [/code] 但是多檔匯出的,我是用TLMDBrowseDlg元件,沒有onIncludeItem事件,所以我不會去處理。 我有試著用下來範例去改 http://delphi.about.com/od/windowsshellapi/l/aa122803a.htm 但一直改不成功,不能抓到整個目錄來過濾,只能抓到最後選擇的目錄而已,請問我要將某些目錄隱藏掉要怎麼辦到呢。 ===================引 用 pedro 文 章=================== 您好 是不是Options.ofForceShowHidden不小心設到True? |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
我昨天試了一下,SHBrowseForFolder,找MSDN並無類似BIF_BROWSEINCLUDEFILES可設定不顯示隱藏資料夾的旗標
剛剛再看看上述的RootKit大大所提的IFolderFilter,用關鍵字找到 http://bak-o-soft.dk/ PBFolderDialog 看它的DEMO程式,也無法得到您要的.... 再想想嘍 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
IFolderFilter 請查 MSDN 不過支援 Windows XP 。
PBFolderDialog 可以用, DEMO 將TestXPFilter 打勾。 不過另一個思考,可以透過 Treeview 的操作。 當 BFFM_INITIALIZED 時,將不要顯示的Item 給刪掉。 這樣的思考可不可行,還沒試過。 ===================引 用 pedro 文 章=================== 我昨天試了一下,SHBrowseForFolder,找MSDN並無類似BIF_BROWSEINCLUDEFILES可設定不顯示隱藏資料夾的旗標 剛剛再看看上述的RootKit大大所提的IFolderFilter,用關鍵字找到 http://bak-o-soft.dk/ PBFolderDialog 看它的DEMO程式,也無法得到您要的.... 再想想嘍 |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
Excuse me, I am not here to answer your question, please check out that you have too many questions case unclosed, close them if possible, whether they already have an proper anwser or not ! except that you are still waiting for a better one.
Thanks for your cooperation. ===================引 用 17kobe 文 章=================== 如標題所說: 不想讓openDialog及saveDialog去看到隱藏目錄,請問要如何辦到。 |
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
最後沒辦法還是自己做一個匯出的視窗,因為可能去抓Treeview視窗可能能還要再去學學
===================引 用 RootKit 文 章=================== IFolderFilter 請查 MSDN 不過支援 Windows XP 。 PBFolderDialog 可以用, DEMO 將TestXPFilter 打勾。 不過另一個思考,可以透過 Treeview 的操作。 當 BFFM_INITIALIZED 時,將不要顯示的Item 給刪掉。 這樣的思考可不可行,還沒試過。 ===================引 用 pedro 文 章=================== 我昨天試了一下,SHBrowseForFolder,找MSDN並無類似BIF_BROWSEINCLUDEFILES可設定不顯示隱藏資料夾的旗標 剛剛再看看上述的RootKit大大所提的IFolderFilter,用關鍵字找到 http://bak-o-soft.dk/ PBFolderDialog 看它的DEMO程式,也無法得到您要的.... 再想想嘍 |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
請適時的處理您尚未結案的問題,如無適合答案,請結缺席。
===================引 用 Stallion 文 章=================== Excuse me, I am not here to answer your question, please check out that you have too many questions case unclosed, close them if possible, whether they already have an proper anwser or not ! except that you are still waiting for a better one. Thanks for your cooperation. ===================引 用 17kobe 文 章=================== 如標題所說: 不想讓openDialog及saveDialog去看到隱藏目錄,請問要如何辦到。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
{ 做出來了 分享給大家 }
在指定的 lpfnHOOK 事件中。 if Msg = WM_NOTIFY then begin Case (POFNotify(LParam)^.hdr.code) of CDN_SELCHANGE :; { 異動選擇 } CDN_FOLDERCHANGE : begin { 設置過濾 } hWndMain := Windows.GetParent(Wnd); hwndShDefView := FindWindowEx(hWndMain,0,'SHELLDLL_DefView',Nil ); if hwndShDefView <> 0 then begin hCltWnd := FindWindowEx(hwndShDefView,0,WC_LISTVIEW,Nil); if hCltWnd <> 0 then begin LvCount := ListView_GetItemCount(hCltWnd); if LvCount > 0 then For I := LvCount - 1 downto 0 do begin TextLen := 255; SetLength(ItemText,TextLen); TextLen := ListView_GetItemText(hCltWnd,I,0,@ItemText[1],TextLen); SetLength(ItemText,TextLen); { 如果檔名為 A.txt 就刪除即隱藏 } if SameText(ItemText,'A.txt') then ListView_DeleteItem(hCltWnd,I); end; end; end; end; end; end; |
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
沒有用過ipfnHOOK,可以給我完整的範例嗎? 感謝~
===================引 用 RootKit 文 章=================== { 做出來了 分享給大家 } 在指定的 lpfnHOOK 事件中。 if Msg = WM_NOTIFY then begin Case (POFNotify(LParam)^.hdr.code) of CDN_SELCHANGE :; { 異動選擇 } CDN_FOLDERCHANGE : begin { 設置過濾 } hWndMain := Windows.GetParent(Wnd); hwndShDefView := FindWindowEx(hWndMain,0,'SHELLDLL_DefView',Nil ); if hwndShDefView <> 0 then begin hCltWnd := FindWindowEx(hwndShDefView,0,WC_LISTVIEW,Nil); if hCltWnd <> 0 then begin LvCount := ListView_GetItemCount(hCltWnd); if LvCount > 0 then For I := LvCount - 1 downto 0 do begin TextLen := 255; SetLength(ItemText,TextLen); TextLen := ListView_GetItemText(hCltWnd,I,0,@ItemText[1],TextLen); SetLength(ItemText,TextLen); { 如果檔名為 A.txt 就刪除即隱藏 } if SameText(ItemText,'A.txt') then ListView_DeleteItem(hCltWnd,I); end; end; end; end; end; end; |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
可以在 FolderChange 處理
procedure TForm1.OpenDialog1FolderChange(Sender: TObject); var hWndMain,hwndShDefView,hCltWnd : THandle; I,LvCount,TextLen : Integer; ItemText : String; begin hWndMain := Windows.GetParent(OpenDialog1.Handle); hwndShDefView := FindWindowEx(hWndMain,0,'SHELLDLL_DefView',Nil ); if hwndShDefView <> 0 then begin hCltWnd := FindWindowEx(hwndShDefView,0,WC_LISTVIEW,Nil); if hCltWnd <> 0 then begin LvCount := ListView_GetItemCount(hCltWnd); if LvCount > 0 then For I := LvCount - 1 downto 0 do begin TextLen := 255; SetLength(ItemText,TextLen); TextLen := ListView_GetItemText(hCltWnd,I,0,@ItemText[1],TextLen); SetLength(ItemText,TextLen); if GetFileAttributes(PChar(ItemText)) = FILE_ATTRIBUTE_DIRECTORY then ListView_DeleteItem(hCltWnd,I); end; end; end; end; ===================引 用 17kobe 文 章=================== 沒有用過ipfnHOOK,可以給我完整的範例嗎? 感謝~ ===================引 用 RootKit 文 章=================== { 做出來了 分享給大家 } 在指定的 lpfnHOOK 事件中。 if Msg = WM_NOTIFY then begin Case (POFNotify(LParam)^.hdr.code) of CDN_SELCHANGE :; { 異動選擇 } CDN_FOLDERCHANGE : begin { 設置過濾 } hWndMain := Windows.GetParent(Wnd); hwndShDefView := FindWindowEx(hWndMain,0,'SHELLDLL_DefView',Nil ); if hwndShDefView <> 0 then begin hCltWnd := FindWindowEx(hwndShDefView,0,WC_LISTVIEW,Nil); if hCltWnd <> 0 then begin LvCount := ListView_GetItemCount(hCltWnd); if LvCount > 0 then For I := LvCount - 1 downto 0 do begin TextLen := 255; SetLength(ItemText,TextLen); TextLen := ListView_GetItemText(hCltWnd,I,0,@ItemText[1],TextLen); SetLength(ItemText,TextLen); { 如果檔名為 A.txt 就刪除即隱藏 } if SameText(ItemText,'A.txt') then ListView_DeleteItem(hCltWnd,I); end; end; end; end; end; end; |
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
真的是因為取得HANDLE後,但視窗未完成,所以LvCount := ListView_GetItemCount(hCltWnd);沒取到ITEM,可能偶爾取得到
所以我要在這一行前,去取得該handle的視窗是否完成,要如何來寫呢 是POSTMESSAGE給該HANDLE看返回該PORCESS已完成了嗎,這我不會寫 ===================引 用 RootKit 文 章=================== 據我瞭解 ListView_GetItemCount 是支援 Vista 並且 SysListView32 也無更動,僅增加了 SysHeader 子元件。 ListView_GetItemCount 會回傳 0 的原因 猜測在當下 VISTA 尚未列出。因此得到 0 個Item。 解決方式在事件中,PostMessage 自訂訊息。 在自訂訊息事件中處理過濾。即可。 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
[code delphi]
procedure TForm1.OpenDialog1FolderChange(Sender: TObject); begin FolderChanged := True; end; procedure TForm1.OpenDialog1SelectionChange(Sender: TObject); var hWndMain,hwndShDefView,hCltWnd : THandle; I,LvCount,TextLen : Integer; ItemText : String; begin if FolderChanged then begin FolderChanged := False; hWndMain := Windows.GetParent(OpenDialog1.Handle); hwndShDefView := FindWindowEx(hWndMain,0,'SHELLDLL_DefView',Nil ); if hwndShDefView <> 0 then begin hCltWnd := FindWindowEx(hwndShDefView,0,WC_LISTVIEW,Nil); if hCltWnd <> 0 then begin LvCount := ListView_GetItemCount(hCltWnd); if LvCount > 0 then For I := LvCount - 1 downto 0 do begin TextLen := 255; SetLength(ItemText,TextLen); TextLen := ListView_GetItemText(hCltWnd,I,0,@ItemText[1],TextLen); SetLength(ItemText,TextLen); if (GetFileAttributes(PChar(ItemText))and FILE_ATTRIBUTE_DIRECTORY) <> 0 then ListView_DeleteItem(hCltWnd,I); end; end; end; end; end; [/code] |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |