2009-12-25 8 views
1

J'aime utiliser de grandes icônes sur mon bureau, mais très souvent, ils reviennent à la taille normale, ne peut toujours pas comprendre pourquoi :). En tant que programmeur, je décide d'écrire mon propre utilitaire pour enregistrer et restaurer les positions des icônes. Googler autour ne donne pas beaucoup d'informations. Est-ce que quelqu'un peut me donner un indice ou un lien vers un point de départ?Comment obtenir/définir la position et la taille des icônes du bureau à partir de Delphi?

Répondre

2

Vous ne pouvez pas être fiable. Raymond Chen explains why dans ce post. Fondamentalement, c'est parce qu'il n'y a aucun moyen de forcer une icône à être dans un emplacement spécifique sur le bureau, ce qui signifie qu'il n'y a aucun moyen de spécifier où une icône individuelle sera positionnée.

+0

Merci, très intéressant! – kuaw26

2

À un moment donné dans le temps, à savoir Win2K/WinXP sûr, le bureau était en fait un type de ListView. Je ne suis pas sûr que ce soit encore dans le nouveau système d'exploitation. Sachant qu'il était facile d'obtenir le handle du bureau et d'utiliser les fonctions d'api de LV manipuler cela en faisant des choses comme l'affichage avec le style de rapport.

Voici deux fonctions qui vous montrent comment commencer à manipuler le bureau.

Remarque: Je sais que cela fonctionne jusqu'à WinXP, et je suppose que cela fonctionnera pour Vista et Win7 mais je ne l'ai pas testé. En utilisant ces exemples, il ne devrait pas vous falloir longtemps pour écrire un ensemble de fonctions pour obtenir/définir les positions des icônes de tout sur le bureau.

procedure ReportStyleDesktop; 
var 
    wHandle : THandle; 
    wStyle : Longint; 
begin 
    wHandle := GetDesktopWindow; 

    if wHandle <> 0 then 
    wHandle := FindWindowEx(wHandle, 0, 'Progman', 'Program Manager'); 

    if wHandle <> 0 then 
    wHandle := FindWindowEx(wHandle, 0, 'SHELLDLL_DefView', 0); 

    if wHandle <> 0 then 
    wHandle := FindWindowEx(wHandle, 0, 'SysListView32', 0); 

    if wHandle <> 0 then 
    begin 
    wStyle := GetWindowLong(wHandle, GWL_STYLE); 
    wStyle := wStyle and (not LVS_TYPEMASK); 
    wStyle := wStyle or LVS_REPORT or LVS_ICON; 
    SetWindowLong(wHandle, GWL_STYLE, wStyle); 
    end; 
end; 

procedure NormalStyleDesktop; 
var 
    wHandle : THandle; 
    wStyle : Longint; 
begin 
    wHandle := GetDesktopWindow; 

    if wHandle <> 0 then 
    wHandle := FindWindowEx(wHandle, 0, 'Progman', 'Program Manager'); 

    if wHandle <> 0 then 
    wHandle := FindWindowEx(wHandle, 0, 'SHELLDLL_DefView', 0); 

    if wHandle <> 0 then 
    wHandle := FindWindowEx(wHandle, 0, 'SysListView32', 0); 

    if wHandle <> 0 then 
    begin 
    wStyle := GetWindowLong(wHandle, GWL_STYLE); 
    wStyle := wStyle and (not LVS_TYPEMASK); 
    wStyle := wStyle or LVS_ICON; 
    SetWindowLong(wHandle, GWL_STYLE, wStyle); 
    end; 
end; 
+0

merci, c'est bon point de commencer – kuaw26

Questions connexes