Einzelnen Beitrag anzeigen

Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Icon + Caption vom "Arbeitsplatz"

  Alt 18. Nov 2006, 18:27
Ich hab jetzt die Lösung gefunden...

Bezeichnung:
Delphi-Quellcode:
  function GetMyComputerName(Default: string = ''): string;
    function ExpandEnvStr(const szInput: string): string;
    begin
      SetLength(Result, ExpandEnvironmentStrings(pChar(szInput), nil, 0));
      ExpandEnvironmentStrings(pChar(szInput), @Result[1], Length(Result));
      Result := StrPas(@Result[1]);
    end;
  var
    Buffer: array[0..MAX_PATH] of char;
    h: hwnd;
    SrcFile: string;
    Index: int64;
    RDF: TRegistry;
  const
    CLSID_MYCOMPUTER = '{20D04FE0-3AEA-1069-A2D8-08002B30309D}';
  begin
    Result := '';

    RDF := TRegistry.Create;
    try
      RDF.RootKey := HKEY_CLASSES_ROOT;
      RDF.OpenKey('CLSID\' + CLSID_MYCOMPUTER, false);

      if (RDF.ValueExists('LocalizedString') = True) and
        (RDF.ReadString('LocalizedString') <> '') then
      begin
        SrcFile := copy(RDF.ReadString('LocalizedString'), 2, MAX_PATH);
        Index := StrToIntDef(Copy(SrcFile, Pos(',', SrcFile) + 1,
          Length(SrcFile)), 0);
        if Index < 0 then
          Index := Index - (2 * Index);
        SrcFile := Copy(SrcFile, 1, Pos(',', SrcFile) - 1);
        SrcFile := ExpandEnvStr(SrcFile);
        if (FileExists(SrcFile) = True) and (Index <> 0) then
        begin
          h := loadlibrary(PAnsiChar(SrcFile));
          try
            if h <> 0 then
            begin
              if Loadstring(h, Index, @Buffer, MAX_PATH) > 0 then
              begin
                Result := StrPas(buffer);
              end
              else
                Result := Default;
            end
            else
              Result := Default;
          finally
            freelibrary(h)
          end;
        end;
      end;
      if (Result = Default) and (RDF.ValueExists('') = True) and
        (RDF.ReadString('') <> '') then
        Result := RDF.ReadString('');
    finally
      RDF.Free;
    end;
  end;
Das Icon bekomme ich, indem ich eine Verknüpfung auf den Arbeitsplatz aus den Resourcen meines Programmes entpacke und diese anschließend an "GetShellIcon" übergebe:
Delphi-Quellcode:
function TDupFind_Main.GetShellIcon(FileName: string; NoFile: boolean): integer;
var
  SHFileInfo: TSHFileInfo;
  Tmp: string;
  Txt: textfile;
begin
  if AUic = False then
  begin
    Result := 0;
    //Falls ein Laufwerksbuchstabe übergeben wurde...
    if Length(FileName) = 1 then
      FileName := FileName + ':';
    //Laufwerke sollten mit \ enden...
    if (Length(FileName) = 2) and (copy(FileName, length(FileName), 1) = ':')
      and
      (copy(FileName, length(FileName), 1) <> '\') then
      FileName := FileName + '\';

    // CoInitialize has to be called before SHGetFileInfo (done by Delphi)
    FillChar(SHFileInfo, SizeOf(TSHFileInfo), 0);

    //Dateiino lesen...
    if NoFile = False then
      ShGetFileInfo(PChar(FileName), 0, SHFileInfo, SizeOf(TSHFileInfo),
        SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON)
    else
      ShGetFileInfo(PChar(FileName), FILE_ATTRIBUTE_ARCHIVE, SHFileInfo,
        SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or
        SHGFI_ICON or SHGFI_USEFILEATTRIBUTES);

    try
      Result := SHFileInfo.iIcon;
    finally
      // you are responsible for destroying the icon handle
      DestroyIcon(SHFileInfo.hIcon);
    end;
  end
  else
    Result := UIdx;
end;
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat