Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Icon + Caption vom "Arbeitsplatz" (https://www.delphipraxis.net/80162-icon-caption-vom-arbeitsplatz.html)

FriFra 3. Nov 2006 21:28


Icon + Caption vom "Arbeitsplatz"
 
Gibt es irgendeine API um an die Caption und das Icon vom "Arbeitsplatz" heran zu kommen?

FriFra 7. Nov 2006 12:06

Re: Icon + Caption vom "Arbeitsplatz"
 
Hat keiner eine Idee? Irgendwie muss das doch gehen... ich kann doch mit div. Tools das Icon vom Arbeitsplatz verändern, Das möchte ich dann aber auch auslesen können ;)

FriFra 18. Nov 2006 17:27

Re: Icon + Caption vom "Arbeitsplatz"
 
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;

Sunlight7 18. Nov 2006 20:02

Re: Icon + Caption vom "Arbeitsplatz"
 
Sorry, das ich diesen Thread nicht früher gesehen hab'.

Einfache Lösung: Siehe

MathiasSimmack 18. Nov 2006 20:11

Re: Icon + Caption vom "Arbeitsplatz"
 
Hm, ich nutze einfach Shell-Funktionen. Ich verweise mal auf die Splitter-Demo in den Tutorials von Luckie. Die nutzt diverse Funktionen, um den Inhalt des "Eigene Dateien"-Ordners anzuzeigen. Das kann man aber natürlich ändern:
Zitat:

Delphi-Quellcode:
// Funktion "FillTreeView"
//    CSIDL_PERSONAL = Eigene Dateien
//    CSIDL_DRIVES  = Arbeitsplatz
SHGetSpecialFolderLocation(hTV,CSIDL_PERSONAL,pidlRoot);

dann zeigt mir der Tree-View links als Knoten "Arbeitsplatz" samt passendem Symbol. Zugegeben, die Symbole in der List-View links passen nicht, aber dennoch handelt es sich dabei um den Inhalt des Arbeitsplatzes (Festplatten, Dateien von Xy, usw.)

:stupid:

Sunlight7 18. Nov 2006 20:27

Re: Icon + Caption vom "Arbeitsplatz"
 
Zitat:

Zitat von MathiasSimmack
Zugegeben, die Symbole in der List-View links passen nicht, aber dennoch handelt es sich dabei um den Inhalt des Arbeitsplatzes (Festplatten, Dateien von Xy, usw.)

Dann hast Du was falsch gemacht :stupid: :mrgreen:
Normalerweise funkt das :zwinker:

MathiasSimmack 19. Nov 2006 08:08

Re: Icon + Caption vom "Arbeitsplatz"
 
Eigentlich nicht. Ich nehme dann nur eine andere "GetShellImg"-Funktion aus meiner Unit, und voilà, dann habe ich auch die richtigen Symbole. Alles nur eine Frage der Einstellung.

Der Punkt ist aber der, dass ich nicht mit irgendwelchen GUIDs und direkten Registryzugriffen arbeiten muss, um Namen und Symbol des Arbeitsplatzes oder anderer Systemelemente zu bekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz