![]() |
LuckieDIPS
Liste der Anhänge anzeigen (Anzahl: 2)
Sichert und stellt die Icon Positionen der Desktopicons wiederher (nur NT ff.)
Mein Dank geht an Nico, der für den Kern des Codes zuständig war. :wink: Neue Version: 2.0 Jetzt mit Unterstützung für Windows 98. Neue Version: 2.1 Bugs gefixet Neue Version: 3.0 Neue Option: Automatisches Sichern der Icon-Positionen. Wird diese Option aktiviert, speichert das Programmautomatisch die Icon-Positionen, wenn sich die Auflösung ändert. Es minimiert sich dann beim Minimieren in die TNA und wird automatisch mit Windows beim Anmelden gestartet. Änderung zurückgenommen. Es funktioniert noch nicht! Neue Version: 3.1 Das Programm kann jetzt mit der Benutzeranmeldung mitgestartet werden und minimiert sich dann in die TNA neben die Uhr. So hat man einen schnellen Zugriff, um die Desktopicon Positionen zu sichern oder wieder herzustellen. Neue Version 3.2 Der Speicherort kann jetzt freigewählt werden, sowohl in der GUI, als auch wenn das Pogramm nur mit Parametern gestartet wird. Optional kann zu den bekannten Parametern /s und /r zum Sichern oder Wiederherstellen mit dem Paramter /p:<Pfad> ein Pfad angegeben werden, in dem die Datei mit den Iconpositionen gespeichert werden soll. Diese Information wird in der Registry gesichert unter: "HKEY_CURRENT_USER\Software\MichaelPuff\LuckieDIPS ". Edit [2007-03-20]: Jetzt mit Uninstaller. Edit [2007-03-21]: Bugs gefixt. Lifting der Oberfläche. Homepage: ![]() |
Re: LuckieDIPS
Ich finde das Tool richtig genial ;-)
...:cat:... |
Re: LuckieDIPS
Danke. :P
|
Re: LuckieDIPS
Als ich noch Win98 hatte, hab ich mich nach so einem Tool gesehnt, so oft wie die Auflösung nach nem Spiel verstellt war.
Heute passiert das zum Glück nicht mehr so oft, aber trotzdem. Endlich hat sich mal einer die Mühe gemacht so ein Tool zu basteln! Ave Luckie & Nico ;-) Bis dann, S - tefano P.S.: Bugs hab ich noch keine gefunden. Kann mir das Tool nämlich nicht runterladen, bekomme vom Server keine Antwort :( |
Re: LuckieDIPS
Ich würde es mir ja gerne runterladen und könnte es wohl auch sehr gut gebrauchen, aber er findet es ncith :sad:
|
Re: LuckieDIPS
Der Server scheint gerade verreckt zu sein :mrgreen:
Ein wenig Geduld und er kommt wieder. Ist halt Linux :angle: ...:cat:... |
Re: LuckieDIPS
Unter diesen Bedingungen eher schwer vorzustellen :mrgreen:
@sakura Warum setzt du eigentlich Windowsserver ein? |
Re: LuckieDIPS
HP geht wieder. Für 98 und NT ff. hat Nico ein Programm. Findet man bei mir in der Ablage unter Exports -> dipssrc.zip Es handelt sich dabei um ein Übersetzung von einem C/C++ Programm von Jeffrey Richter. Da der Delphi-Compiler aber keine Shared Resources (oder so) unterstützt, mußte er ein paar recht geniale Klimmzüge machen. Auf alle Fälle lohnenswert sich die Sourcen mal anzukucken.
|
Re: LuckieDIPS
So jetzt habe ich's ausprobiert, aber erstens sind ein paar Ordner weg und zweitens sehen die iocons so komisch aus (WinXP), sie haben einen schwarzen Rand..
Und wie ist das, speichert dein Programm auch die Infos, wenn man es schließt? Nachtrag: ah habe die Ini nicht gesehen ;-) |
Re: LuckieDIPS
So habe gerade gemerkt, dass sie nicht weg sind, sondern das ein paar Icons ihr Position gewechselt haben. Also so ganz funktioniert es noch nciht.
|
Re: LuckieDIPS
Nach der Anwendung meines Programmes? Kuck mal, ob die verschwundenen Ordner in der Ini-Datei stehen.
Wie viele Icon hast du denn auf dem Desktop? |
Re: LuckieDIPS
Sie sind ja doch ncith verschwunden, sonder haben ihre Position gewechselt...
Sie stehen aber in der Ini drinne. Es sind ca 35 Icons. |
Re: LuckieDIPS
Dein aktivierter ActiveDesktop wird mein Programm aushebeln.
|
Re: LuckieDIPS
Das Programm ist wirklich gut und funktioniert bei mir einwandfrei. Kann es auch gebrauchen, denn bei mir Win2000 verstellen sich meistens von gerade installierten Programmen, die Icons doch relativ häufig.
|
Re: LuckieDIPS
Jau, bei mir funktionierts auch.
Echt nützlich! Bis dann, S - tefano |
Re: LuckieDIPS
Wie gesagt, wird der ActiveDesktop sein. das ist wohl kein gewöhnliches Fenster. Und das hebelt eben die LuckieDIPS aus.
|
Re: LuckieDIPS
Neue Version ist da: 1.1
Was ist neu? Die Ini-Datei mit den Iconpositionen wird jetzt nicht mehr im Programmverzeichnis gespeichert, wo der Anwender eventuell keine Schreibrechte hat, sondern in seinem persönlichen lokalen Einstellungen für die Anwendungsdaten, zum Beispiel:
Code:
Download:
x:\Dokumente und Einstellungen\username\Lokale Einstellungen\Anwendungsdaten
![]() |
Re: LuckieDIPS
Und noch eine neue Version: 1.2
- Speicherort der Ini-Datei jetzt 'C:\Dokumente und Einstellungen\%username%\Lokale Einstellungen\Anwendungsdaten\LuckieDIPS - Schaltfläche zum Entfernen der Datei und des Ordners hinzugefügt. Download: ![]() |
Re: LuckieDIPS
Es gibt wieder eine neue Version der LuckieDIPS. Neu ist, dass man es jetzt mit Paramertern starten kann und so die Iconpositionen automatsich wiederhergestellt oder gesichert werden. Näheres dazu auf der LuckieDIPS Homepage.
Download: ![]() Homepage: ![]() |
Re: LuckieDIPS
Und wieder eine neue Version. Dank eines Wrappers von NicoDE wird jetzt auch Windows98 unterstützt.
Download: ![]() Homepage: ![]() |
Re: LuckieDIPS
Klappt es mittlerweile mit ActiveDesktop?
Gruss lkz633 |
Re: LuckieDIPS
Nein noch nicht. Nico will sich das wohl mal angucken.
|
Re: LuckieDIPS
Kann mir mal jemand erklären, worauf die ganze neue Euphorie für LuckieDIPS beruht? Wohl kaum auf dem aktuell aktualisierten Sourcecode. Eher auf den Veröfentlichungen in der ComputerBild?
Wes Wein ich trink, des Lied ich sing... Die Redakteure der Computerzeitschriften fragen stets vorher an... Also was ist wem peinlich? |
Re: LuckieDIPS
Was soll das 4toms? Du pupst den ganzen Tag hier schon rum... wirft ein komisches Licht auf dich :(
(Sorry für ot, lag mich aber am Herzen.) |
Re: LuckieDIPS
Zitat:
Absolut kritikresistente Fans hätte ich auch ganz gerne! Edit: Werde in LuckieDIPS nicht mehr schreiben. Danke. |
Re: LuckieDIPS
Zitat:
|
Re: LuckieDIPS
Hallo Michael!
Heute habe ich mir Dein Programm runtergeladen und bin arg enttäuscht! Zitat:
Mal sehen, vielleicht komme ich in den nächsten Tagen dazu, das Ganze in D5Standard mal zu debuggen. 2. Unter XP Home konnte die Datei nicht gespeichert werden - aber der Ordner wurde angelegt! Ist ja auch klar, Du hast ja sinngemäß programmiert:
Delphi-Quellcode:
Wenn die Datei nicht existiert, kann sie auch nicht gelöscht werden :wall:
if FileDelete(dateinamen) then
speichern else fehlermeldung; Nach dem Kopieren der Ini aus dem Source-Ordner klappte es dann - aber nach dem Anklicken des Löschbuttons war (logischerweise) das Problem wieder da. Irgendwas ist das doch wohl schiefgelaufen - Löschen nur, wenn Datei vorhanden, speichern wenn keine Datei oder Löschen erfolgreich wäre die richtige Vorgehensweise. Ob die Datei existiert, prüfts Du doch ab und schaltest die Buttons entsprechend frei! Der übliche Fehler - man hat selber die Datei schon auf der Platte und vergißt den Test auf einem frischen System. Gruß Dietmar Brüggendiek |
Re: LuckieDIPS
3. (Win64) Ein 64-Bit Shell-Prozess liefert die Item-Texte nicht da der Zeiger für den Puffer nil ist (wird in der Debug-Version abgefangen und Explorer ignoriert die Nachricht).
Gruß Nico |
Re: LuckieDIPS
Zitat:
Delphi-Quellcode:
function IsActiveDesktopActive: Boolean;
var Progman: HWND; DefView: HWND; begin Result := False; Progman := FindWindow('Progman', nil); if Progman <> HWND(nil) then begin DefView := FindWindowEx(Progman, HWND(nil), 'SHELLDLL_DefView', nil); if DefView <> HWND(nil) then Result := FindWindowEx(DefView, HWND(nil), 'HTML_Internet Explorer', nil) <> HWND(nil); end; end; function GetDesktopListView: HWND; var Progman: HWND; DefView: HWND; function EnumDefViewProc(Wnd: HWND; out DefView: HWND): BOOL; stdcall; var ClassName: array [0..255] of Char; begin DefView := Wnd; ClassName[0] := #0; GetClassName(Wnd, ClassName, 255); Result := StrComp(ClassName, 'SHELLDLL_DefView') <> 0; end; begin Result := HWND(nil); Progman := FindWindow('Progman', nil); if Progman <> HWND(nil) then begin DefView := FindWindowEx(Progman, HWND(nil), 'SHELLDLL_DefView', nil); if DefView <> HWND(nil) then begin if IsActiveDesktopActive then EnumChildWindows(DefView, @EnumDefViewProc, LPARAM(@DefView)); Result := FindWindowEx(DefView, HWND(nil), 'SysListView32', nil); end; end; if Result = HWND(nil) then MessageBox(HWND(nil), PChar(ERROR_GETDESKTOPHANDLE), APPNAME, MB_ICONERROR); end; Gruss Nico |
Re: LuckieDIPS
Zitat:
Zitat:
Nachtrag: Sollte alles erledigt sein. Guckt jetzt bitte noch mal, ob richtig gespeichert wird und ob jetzt auch der Active Desktop unterstützt wird. Download Links hier im letzten Posting oder gleich im ersten. |
Re: LuckieDIPS
Wenn wir schon dabei sind, 64-Bit Support...
GetDesktopIconInfo()
Delphi-Quellcode:
SetDesktopIconPos()
const
ItemBufferBlockSize = $1000; type PLvItemBuffer = ^TLvItemBuffer; TLvItemBuffer = packed record case Integer of 0: ( LvItem32: packed record mask : LongWord; iItem : LongInt; iSubItem : LongInt; state : LongWord; stateMask : LongWord; pszText : LongWord; cchTextMax: LongInt; iImage : LongInt; lParam : LongWord; iIndent : LongInt; iGroupId : LongInt; cColumns : LongWord; puColumns : LongWord end); 1: ( LvItem64: packed record mask : LongWord; iItem : LongInt; iSubItem : LongInt; state : LongWord; stateMask : LongWord; _align1 : LongWord; pszText : Int64; cchTextMax: LongInt; iImage : LongInt; lParam : Int64; iIndent : LongInt; iGroupId : LongInt; cColumns : LongWord; _align2 : LongWord; puColumns : Int64; end); 2: (LvItemBuff: array [0..ItemBufferBlockSize - 1] of Byte; case Integer of 0: (AnsiText: array [0..ItemBufferBlockSize - 1] of AnsiChar); 1: (WideText: array [0..ItemBufferBlockSize div 2 - 1] of WideChar); 2: (ItemText: array [0..ItemBufferBlockSize div SizeOf(Char)-1] of Char)); end; type TFNIsWow64Process = function(hProcess: THandle; out Wow64Process: BOOL): BOOL; stdcall; var FNIsWow64Process: TFNIsWow64Process; function IsWow64Process(hProcess: THandle): Boolean; var Wow64Process: BOOL; begin if not Assigned(FNIsWow64Process) then FNIsWow64Process := TFNIsWow64Process( GetProcAddress(GetModuleHandle(kernel32), 'IsWow64Process')); if not Assigned(FNIsWow64Process) then Result := False else Result := FNIsWow64Process(hProcess, Wow64Process) and Wow64Process; end; function GetDesktopIconInfo: TDesktopIconInfoArray; var ListView : HWND; ProcessId: DWORD; Process : THandle; Size : Cardinal; // SIZE_T MemLocal : PLvItemBuffer; MemRemote: PLvItemBuffer; NumBytes : Cardinal; // SIZE_T IconCount: DWORD; IconIndex: Integer; IconLabel: string; IconPos : TPoint; DesktopIconInfoArray: TDesktopIconInfoArray; begin // Fensterhandle des Desktop-ListView ermitteln und Prozess oeffnen ListView := GetDesktopListView; ProcessId := 0; GetWindowThreadProcessId(ListView, @ProcessId); Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId); if Process <> 0 then try // Lokalen und entfernten (im Zielprozess) Puffer anlegen Size := SizeOf(TLvItemBuffer); MemLocal := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE); MemRemote := VirtualAllocEx(Process, nil, Size, MEM_COMMIT, PAGE_READWRITE); if Assigned(MemLocal) and Assigned(MemRemote) then try // Anzahl der Symbole ermitteln und in einer Schleife durchlaufen IconCount := SendMessage(ListView, LVM_GETITEMCOUNT, 0, 0); Setlength(DesktopIconInfoArray, IconCount); for IconIndex := 0 to IconCount - 1 do begin // Symboltext auslesen // (es gibt zwei identische Strukturen, jeweils eine in diesem und eine // im Zielprozess. Wobei die Daten zwischen den Puffern hin und her // kopiert werden muessen. Dieser Aufwand ist noetig, da LVM_GETITEM // eine Struktur liest und schreibt, die sich im Adressraum des // Prozesses befindet, dem das entsprechende Fenster gehoert...) ZeroMemory(MemLocal, SizeOf(TLvItemBuffer)); with MemLocal^ do if IsWow64Process(GetCurrentProcess) and not IsWow64Process(Process) then begin LvItem64.mask := LVIF_TEXT; LvItem64.iItem := IconIndex; LvItem64.pszText := Cardinal(MemRemote) + ItemBufferBlockSize; LvItem64.cchTextMax := High(MemLocal.ItemText) + 1; end else begin LvItem32.mask := LVIF_TEXT; LvItem32.iItem := IconIndex; LvItem32.pszText := Cardinal(MemRemote) + ItemBufferBlockSize; LvItem32.cchTextMax := High(MemLocal.ItemText) + 1; end; NumBytes := 0; if WriteProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) and Boolean(SendMessage(ListView, LVM_GETITEM, 0, LPARAM(MemRemote))) and ReadProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) then begin IconLabel := string(MemLocal.ItemText); // Position auslesen // (-1, -1 ist nur ein Indiz fuer einen Fehlschlag, da diese Position // natuerlich moeglich ist...) IconPos.X := -1; IconPos.Y := -1; if Boolean(SendMessage(ListView, LVM_GETITEMPOSITION, IconIndex, LPARAM(MemRemote))) and ReadProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) then begin IconPos := PPoint(MemLocal)^; end; // Speichern ;) DesktopIconInfoArray[IconIndex].Caption := IconLabel; DesktopIconInfoArray[IconIndex].Position.X := IconPos.X; DesktopIconInfoArray[IconIndex].Position.Y := IconPos.Y; end; result := DesktopIconInfoArray; end; except // Exceptions ignorieren end; // Aufraeumen if Assigned(MemRemote) then VirtualFreeEx(Process, MemRemote, 0, MEM_RELEASE); if Assigned(MemLocal) then VirtualFree(MemLocal, 0, MEM_RELEASE); finally CloseHandle(Process); end; end;
Delphi-Quellcode:
BTW, in der Schleife von GetDesktopIconInfoFromIni() sollte überprüft werden ob Length(IniSections[Loop]) > 0 ist (sonst kommt es bei einer (angeblich) leeren Section zu einer Zugriffsverletzung).
function SetDesktopIconPos(DesktopIconInfoArray: TDesktopIconInfoArray):
Boolean; var Listview : HWND; ProcessId: DWORD; Process : THandle; Size : Cardinal; MemLocal : PLvItemBuffer; MemRemote: PLvItemBuffer; IconCount: Integer; IconIndex: Integer; IconLabel: string; IconPos : TPoint; NumBytes : Cardinal; Loop : Integer; begin Result := False; // Kommentare siehe GetDesktopIconInfo ;o) ListView := GetDesktopListView(); ProcessId := 0; GetWindowThreadProcessId(ListView, @ProcessId); Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId); if Process <> 0 then try Size := SizeOf(TLVItemBuffer); MemLocal := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE); MemRemote := VirtualAllocEx(Process, nil, Size, MEM_COMMIT, PAGE_READWRITE); if Assigned(MemLocal) and Assigned(MemRemote) then try IconCount := SendMessage(ListView, LVM_GETITEMCOUNT, 0, 0); for IconIndex := 0 to IconCount - 1 do begin ZeroMemory(MemLocal, SizeOf(TLvItemBuffer)); with MemLocal^ do if IsWow64Process(GetCurrentProcess) and not IsWow64Process(Process) then begin LvItem64.mask := LVIF_TEXT; LvItem64.iItem := IconIndex; LvItem64.pszText := Cardinal(MemRemote) + ItemBufferBlockSize; LvItem64.cchTextMax := High(MemLocal.ItemText) + 1; end else begin LvItem32.mask := LVIF_TEXT; LvItem32.iItem := IconIndex; LvItem32.pszText := Cardinal(MemRemote) + ItemBufferBlockSize; LvItem32.cchTextMax := High(MemLocal.ItemText) + 1; end; NumBytes := 0; if WriteProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) and Boolean(SendMessage(ListView, LVM_GETITEM, 0, LPARAM(MemRemote))) and ReadProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) then begin IconLabel := string(MemLocal.ItemText); for Loop := 0 to Length(DesktopIconInfoArray) - 1 do begin if DesktopIconInfoArray[Loop].Caption = IconLabel then begin IconPos.X := DesktopIconInfoArray[IconIndex].Position.X; IconPos.Y := DesktopIconInfoArray[IconIndex].Position.Y; Result := BOOL(SendMessage(Listview, LVM_SETITEMPOSITION, Loop, MAKELPARAM(IconPos.X, IconPos.Y))); end; end; end; end; except // Exceptions ignorieren end; if Assigned(MemLocal) then VirtualFree(MemLocal, 0, MEM_RELEASE); if Assigned(MemRemote) then VirtualFreeEx(Process, MemRemote, 0, MEM_RELEASE); finally CloseHandle(Process); end; end; Gruss Nico ps: für Unicode müsste man das Programm komplett umschreiben (habe Dateien mit japanischen Symbolen auf dem Desktop...) :) |
Re: LuckieDIPS
Zitat:
Zitat:
|
Re: LuckieDIPS
Zitat:
Zitat:
edit: Mail ist raus. |
Re: LuckieDIPS
Kannst du mir die dpr-Datei schicken?
|
Re: LuckieDIPS
So, jetzt läuft es auch unter 64-Bit Windows XP, dank Nico. :thumb:
|
Re: LuckieDIPS
Kannst du den neuen Quellcode mit Acticve Desktop Unterstützung hochladen?
Danke und Gruss lkz633 |
Re: LuckieDIPS
Ist doch schon oben. :gruebel:
|
Re: LuckieDIPS
Ok, hatte die Einschränkung noch in der Readme gelesen
Zitat:
Gruss lkz633 |
Re: LuckieDIPS
Danke fürs Testen.
|
Re: LuckieDIPS
Es gab offensichtlich manchmal Probleme, dass die Iconpositionen beim Wiederherstellen durcheinander gewürfelt wurden. IOch hoffe das habe ich in Version 2.1 gefixet bekommen. Download im ersten Beitrag.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz