好,這裏是修訂 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版本的工作,那絕對是正確的方法,而不是這個垃圾。
請看看我的新問題:http://stackoverflow.com/questions/3484860/implementing-shgetsetsettings-in-delphi – 2010-08-14 19:45:33