Chargement du curseur 'main' de windows, résolution variables d'environnement

Contenu du snippet

Suite à mon code de 'Récupération des curseurs Windows', voici une nouvelle fonction qui permet, sous 2000/XP, de charger le curseur 'Main' de Windows (.CUR ou .ANI) et de remplacer crHandPoint.
Il utilise une fonction de résolution de variables d'environnement, pour ceux qui ne connaisse pas, '%SYSTEMROOT%\Cursors' = 'C:\WINDOWS\Cursors', etc...

Source / Exemple :


// Retourne un nom de fichier avec résolution des variables d'environnement
//  Filename: nom contenant
function ExpandEnv(s: string): string;
var
    Res: Cardinal;
    Name: PChar;
begin
    // Alloue la mémoire
    GetMem(Name, MAX_PATH);
    // Appel de la fonction de résolution de variables
    Res := ExpandEnvironmentStrings(PChar(s), Name, MAX_PATH);
    // Si la mémoire allouée n'est pas assez grande, le résultat est la taille
    // nécessaire devant être allouée
    if Res > MAX_PATH then
    begin
        // Réallocation de la mémoire et nouvel appel
        GetMem(Name, Res);
        ExpandEnvironmentStrings(PChar(s), Name, Res);
    end;
    Result := Name;
    // Libération de la mémoire
    FreeMem(Name);
end;

function LoadWindowsHand: boolean;
var
    s: string;
    Res: HCURSOR;
begin
    // Initialise les variables
    Result := true;
    s := '';

    // Vérifie si un fichier est définit dans la base de registre
    with TRegistry.Create do
    try
        RootKey := HKEY_CURRENT_USER;
        if Openkey('\Control Panel\Cursors', false) then
        begin
            s := ExpandEnv(ReadString('Hand'));
            CloseKey;
        end;
    finally
        Free;
    end;
    // Vérifie si le fichier existe
    if (s <> '') and FileExists(s) then
        // Essaie de charger le fichier
        Res := LoadCursorFromFile(Pchar(s))
    else
        // Essaie de charger le curseur Windows par défaut
        Res := LoadCursor(0, IDC_HAND);

    // Un curseur a été chargé si Res n'est pas nul
    if Res <> 0 then
        // Remplace le curseur Delphi 'crHandPoint'
        Screen.Cursors[crHandPoint] := Res
    else
        // Aucun curseur n'a été chargé
        Result := false;
end;

Conclusion :


J'utilise la fonction de résolution depuis très longtemps et je n'ai jamais eu de soucis avec, pour le chargement du curseur, je n'ai pas eu de problème.
Si vous voyez une quelconque erreur, une portion inutile ou non optimisée, n'hésitez pas à laisser vos modifications, parce que je compte bien utiliser celle-ci dans la majorité de mes programmes.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.