好,这里是修订 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