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 pdwResult : PDWORD; pdwWork : PDWORD; dwCountIn : DWORD; dwCountOut : DWORD; i, vPID: integer;
begin dwCountOut := 0; dwCountIn := 1024; pdwResult := AllocMem(dwCountIn); try if not EnumProcesses(pdwResult,dwCountIn,dwCountOut) then begin ShowMessage(SysErrorMessage(GetLastError)); end else begin pdwWork := pdwResult; MMO_Processes.Clear;
for i := 1 to (dwCountOut shr 2) do begin if (GetProcessName(pdwWork^) <> '') then begin vPID:=pdwWork^; MMO_Processes.Lines.Add(GetProcessName(vPID)); MMO_Processes.Lines.Add(IntToStr(vPID); end; 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
Motzi: 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('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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!