線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4159
推到 Plurk!
推到 Facebook!

請問如何讓openDialog元件,開啟時看不到隱藏目錄

答題得分者是:RootKit
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-28 16:57:19 IP:60.250.xxx.xxx 訂閱
如標題所說:
不想讓openDialog及saveDialog去看到隱藏目錄,請問要如何辦到。
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-28 17:31:54 IP:60.248.xxx.xxx 未訂閱
您好

是不是Options.ofForceShowHidden不小心設到True?
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-04-02 16:35:00 IP:60.250.xxx.xxx 訂閱
我主要是要用在單檔存檔跟多檔匯出的功能上,設定你說的那個屬性無效。
單檔存檔用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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-04-02 23:15:49 IP:61.222.xxx.xxx 訂閱
IFolderFilter
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-04-03 09:15:46 IP:60.248.xxx.xxx 未訂閱
我昨天試了一下,SHBrowseForFolder,找MSDN並無類似BIF_BROWSEINCLUDEFILES可設定不顯示隱藏資料夾的旗標
剛剛再看看上述的RootKit大大所提的IFolderFilter,用關鍵字找到
http://bak-o-soft.dk/
PBFolderDialog
看它的DEMO程式,也無法得到您要的....
再想想嘍
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-04-03 13:25:58 IP:61.222.xxx.xxx 訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-04-03 15:10:57 IP:75.41.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-04-04 15:58:52 IP:220.132.xxx.xxx 訂閱
最後沒辦法還是自己做一個匯出的視窗,因為可能去抓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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-04-04 23:48:09 IP:203.73.xxx.xxx 訂閱
請適時的處理您尚未結案的問題,如無適合答案,請結缺席。

===================引 用 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-04-05 18:47:44 IP:61.222.xxx.xxx 訂閱
{ 做出來了 分享給大家 }
在指定的 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-07-03 14:34:45 IP:60.250.xxx.xxx 訂閱
沒有用過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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-07-14 21:11:34 IP:61.222.xxx.xxx 訂閱
可以在 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-07-15 14:43:10 IP:210.68.xxx.xxx 訂閱
感謝你的回覆,但是在VISTA中會有錯誤,HANDLE還是正確,只不過VISTA上面還有一排工具列,造成ListView_GetItemCount此函數讀不到資訊.不知道還有沒有其它方法.
編輯記錄
17kobe 重新編輯於 2008-07-23 20:47:25, 註解 無‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-07-23 22:48:02 IP:122.126.xxx.xxx 訂閱
據我瞭解 ListView_GetItemCount 是支援 Vista 
並且 SysListView32 也無更動,僅增加了 SysHeader 子元件。

ListView_GetItemCount 會回傳 0 的原因
猜測在當下 VISTA 尚未列出。因此得到 0 個Item。

解決方式在事件中,PostMessage 自訂訊息。
在自訂訊息事件中處理過濾。即可。
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-07-24 14:24:32 IP:60.250.xxx.xxx 訂閱
真的是因為取得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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-07-24 16:56:11 IP:61.222.xxx.xxx 訂閱
[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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2008-07-24 16:58:53 IP:61.222.xxx.xxx 訂閱
虧了!
為了 VISTA 兼容 還真問題很多。
系統時間:2024-04-24 10:05:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!