Entwickler-Ecke

Windows API - Icon von Prozess Speichern


Experience1986 - Mi 18.02.04 16:40
Titel: Icon von Prozess Speichern
Hi,

Ich lese mit folgenden Code die aktuellen Windows Prozesse und ihr Prozessor ID aus, und speichere diese in einer HTML Datei. Nun möchte ich bei jedem Prozess dessen Icon, falls vorhanden in eine Datei speichern.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
procedure TFRM_Main.TMR_MainTimerTimer(Sender: TObject);
var
  // VAriablen für Prozesse und PID's
  pdwResult  : PDWORD; // für den Buffer
  pdwWork    : PDWORD; // um dem Buffer verarbeiten zu können
  dwCountIn  : DWORD;  // Grösse des Buffers in Byte
  dwCountOut : DWORD;  // Zurückgelieferte Anzahl Byte
  i, vPID: integer;

begin
  dwCountOut := 0;    // Sicherheitshalber initialisieren, muss nicht sein
  dwCountIn  := 1024; // Willkürlich gewählt, genügt für 256 Prozesse
  pdwResult  := AllocMem(dwCountIn);
  try
    if not EnumProcesses(pdwResult,dwCountIn,dwCountOut) then begin
      ShowMessage(SysErrorMessage(GetLastError));
    end else begin
      pdwWork := pdwResult; // zur Verarbeitung übergeben, damit FreeMem funktioniert
      MMO_Processes.Clear;



      for i := 1 to (dwCountOut shr 2) do begin // shr 2 = / 4, da 4 Byte je DWORD
        // Prozess Id ausgeben
        if (GetProcessName(pdwWork^) <> '') then
         begin
           vPID:=pdwWork^;
           MMO_Processes.Lines.Add(GetProcessName(vPID));
           MMO_Processes.Lines.Add(IntToStr(vPID);
         end;
        // auf nächste addressieren (inc erhöht automatisch um 4, da es ein typisierter Pointer ist
        inc(pdwWork);
      end;

  MMO_Processes.Lines.SaveToFile(FRM_Settings.EDT_ExecuteDir.Text+'\processes.htm');

    end;
  finally
    FreeMem(pdwResult,dwCountIn);
  end;

end;


Wie ich ein Icon in ein TImage lade, das weis ich.


Delphi-Quelltext
1:
2:
3:
4:
[...]
    SHGetFileInfo(PChar(Datei), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_LARGEICON or SHGFI_TYPENAME);
    IMG.Picture.Icon.Handle := FileInfo.hIcon;
[...]


Wie kann ich nun anstatt das Icon an TImage zu senden als datei speichern?
Am besten ohne es vorher an TImage zu senden.

Moderiert von user profile iconMotzi: Topic verschoben


Delete - Mi 18.02.04 16:47

Prozesse haben keine Icons. Prozesse sind nur Container für Threads. Sie stellen nur den Adressraum für die Threads zur Verfügung und das Kernel-Objekt für Windows zur Verwaltung. Alleine das Fenster hat ein Icon. Du musst also den Hauptthread vom dem Prozess finden, der das Fenster bereitstellt, wenn die Anwendung überhaupt ein Fenster hat.
Alternativ kannst du versuchen an das Icon in der Programmdatei zu kommen.


Experience1986 - Mi 18.02.04 17:58

Genau das meine ich doch, im prinziüp muss ich nur wissen, wie ich aus einer exe datei das icon als gif oder jpg speichern kann.


Delete - Mi 18.02.04 20:20

Das Icon, welches der Explorer zum anzeigen nimmt, ist das mit der kleinsten ID in der Ressource. Sollte man mit LoadIcon drankommen.


Delete - Mi 18.02.04 20:37

Nachtrag:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
  hModule, hIcon: THandle;
begin
  //hModule := LoadLibrary(PChar(Paramstr(0)));
  //hIcon := LoadIcon(hModule, MAKEINTRESOURCE('MAINICON'));
  hModule := LoadLibrary(PChar('c:\winnt\notepad.exe'));
  hIcon := LoadIcon(hModule, MAKEINTRESOURCE(1));
  DrawIcon(Canvas.Handle, 0, 0, hIcon);
end;

Problem: Bei Delphianwendungen mit der VCL hat das Exe Icon die ID MAINICON. Bei Notepad hat es die ID 1. Das Icon vom Explorer 100.

Nun ja, von hinten durch die Brust ins Auge. Kuckt dir mal SHGetFileInfo mit der Struktur SHFileinfo an. Ist in der ShellAPI drin.


Experience1986 - Mi 18.02.04 21:01

Nochmal: Ich kann das Icon ja schon auslesen, also ich muss ja schon daten haben, nur wie bekomme ich diese daten als datei gespeichert???


Delete - Do 19.02.04 01:12

Ist IMG ein TImage? Dann kennt Picture doch auch die Methode SaveToFile. Bzw. die Eigenschaft Icon von Picture kennt diese. Und wie man ein Icon in ein Bitmap und ein Bitmap in ein JPG umwandelt, dazu sollte es Code hier im Forum geben.


Experience1986 - Do 19.02.04 06:40

Ich wusste ja wie ich mit SaveToFile arbeite, nur ich wollte es ohne TImage lösen, also direkt speichern.
Nun hab ich es mit TImage gemacht.