Autor Beitrag
Experience1986
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Mi 18.02.04 17:40 
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.


ausblenden volle Höhe 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.

ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.02.04 17: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Mi 18.02.04 18: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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.02.04 21:20 
Das Icon, welches der Explorer zum anzeigen nimmt, ist das mit der kleinsten ID in der Ressource. Sollte man mit LoadIcon drankommen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.02.04 21:37 
Nachtrag:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Mi 18.02.04 22: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???
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 19.02.04 02: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Do 19.02.04 07: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.