2010-08-14 51 views
2

我有一個Delphi 2010應用程序顯示/隱藏XP下的桌面圖標罰款。然而,在我的Window 7測試環境下(恰好是64位),圖標不會消失。舊Delphi隱藏/顯示桌面圖標方法不工作在Windows 7 64位

這裏是我使用(用於隱藏)關鍵代碼:

ShowWindow(FindWindow(nil, 'Program Manager'), SW_HIDE); 

我發現我可以設置註冊表:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] 
"HideIcons"=dword:00000001 

如果我重新啓動窗口(即正常工作或殺死資源管理器並重新啓動它),但是有沒有辦法讓舊代碼工作和/或告訴桌面重新加載使用新的註冊表信息,而沒有這種激進的方法。

提前致謝。

+0

請看看我的新問題:http://stackoverflow.com/questions/3484860/implementing-shgetsetsettings-in-delphi – 2010-08-14 19:45:33

回答

2

好,這裏是修訂 hackish的方法(對不起亞歷山大!):

var 
DeskHandle : HWND; 

... 

/////////////////////////////////////////////////////////////////////// 
// Callback function for EnumWindows 
/////////////////////////////////////////////////////////////////////// 
function MyGetWindow (Handle: HWND; NotUsed: longint): bool; stdcall; 
var 
    hChild : HWND; 
begin 
    if handle <> 0 then 
    begin 
    hChild := FindWindowEx(handle, 0, 'SHELLDLL_DefView' ,nil); 
    if hChild <> 0 then 
    begin 
     hChild := FindWindowEx(hChild, 0, 'SysListView32' ,nil); 
     if hChild <> 0 then 
     begin 
     DeskHandle := hChild; 
     end; 
    end; 
    end; 
    result := TRUE; 
end; 

procedure ShowDesktopIcons(const Show : boolean) ; 
begin 
    DeskHandle := 0; 
    EnumWindows(@MyGetWindow, 0); 

    if DeskHandle <> 0 then 
    begin 
    if Show then 
    begin 
     ShowWindow(DeskHandle, SW_SHOW); 
    end 
    else 
    begin 
     ShowWindow(DeskHandle, SW_HIDE); 
    end; 
    end; 
end; 

問題的出現是因爲 「普羅格曼」 和SysListView32之間的父/子關係已經從XP變更爲VISTA/Win7的(正是爲什麼你不應該使用黑客;-)。另外,在Win7下(我的測試環境)應用一個包含多個圖片的主題可以進一步改變這種關係。因此,新例程將查看所有窗口,直到找到一個具有「SHELLDLL_DefView」和「SysListView32」子集的項目爲止。然後它返回全局變量DeskHandle中SysListView32的句柄。不優雅,不確定在未來的代碼中工作,但今天起作用。

如果任何人都可以獲得SHGetSetSettings版本的工作,那絕對是正確的方法,而不是這個垃圾。

+0

我注意到,當與德爾福2009年編譯的Windows 7 64位沒有影響。 – 2010-08-14 18:29:20

+0

安德烈亞斯,你是正確的,它只適用於某些情況。問題在於主題。我出於另一個原因去了Windows 7 Basic主題,並且代碼正常工作。我將其歸因於代碼,而不是主題更改(哎呀!)。 – lgallion 2010-08-14 18:43:55

+1

問題再次是「Progman」窗口的位置。隨着Win 7的默認主題的結構如下: 「 - > SysListView32 - > SHELLDLL_DEFView - >普羅格曼」 一個主題: 「 - > SysLIstView32 - > SHELLDLL_DefView - > WorkerW - > WorkerW - > Progman「 我想把德爾福2010年的代碼放到一起,無論它嵌套得多深(不同的主題可能會創建不同數量的WorkerW(或其他類型)的Windows在堆棧。任何幫助將 – lgallion 2010-08-14 19:42:11

0

使用'ProgMan'而不是'程序管理器'。
在Win 7 32位工作(這裏沒有我的64位可用)。

procedure ShowDesktopIcons(const Visible: Boolean); 
var 
    h: THandle; 
begin 
    h := FindWindow('ProgMan', nil); 
    if h = 0 then 
    RaiseLastOSError; 
    if Visible then 
    ShowWindow(h, SW_SHOW) 
    else 
    ShowWindow(h, SW_HIDE); 
end; 

procedure TForm1.btnHideClick(Sender: TObject); 
begin 
    ShowDesktopIcons(False); 
end; 

procedure TForm1.btnShowClick(Sender: TObject); 
begin 
    ShowDesktopIcons(True); 
end; 
+1

這不適用於Windows 7 64位。 – 2010-08-14 11:55:12

+1

不要使用黑客 – Alex 2010-08-14 12:46:42

+0

@亞歷克斯 - 仍然每個人都使用他們aaaaaaall時間.... :) – Ampere 2016-04-19 11:37:01

4

使用SHGetSetSettings function。您有興趣fHideIcons字段和相應的SSF_HIDEICONS標誌。

或者,您可以使用corresponding group policy

+0

這似乎是很好的方式來做到這一點,的確如此。 – 2010-08-14 12:54:05

+0

@亞歷山大,如果你已經做了這個工作,你也可以回答http://stackoverflow.com/questions/3326062/how-do-i-make-the-show-hide-desktop-icons-setting-take-effect – 2010-08-14 12:59:42

+0

我**不是**這個領域的專家 - 我只是做一個快速的谷歌搜索。 *這花了我1分鐘的時間*。我也發佈了針對您指定問題的答案 - 採用相同的方法。附: Seriosly,我不明白爲什麼任何「RTFM」的答案在這裏StackOverflow(即使它在谷歌搜索詞上有鏈接)被低估了。通過Google官方文檔搜索獲得批准的解決方案,您會獲得** MUCH **更好的結果,而不是使用來自答案的黑客(註冊表讀/寫,窗口操縱等)。 – Alex 2010-08-14 13:11:49