AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte LuckieDIPS
Thema durchsuchen
Ansicht
Themen-Optionen

LuckieDIPS

Ein Thema von Luckie · begonnen am 16. Aug 2003 · letzter Beitrag vom 11. Mär 2012
Antwort Antwort
Seite 4 von 10   « Erste     234 56     Letzte »    
Benutzerbild von Luckie
Luckie
Registriert seit: 29. Mai 2002
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.

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: LuckieDIPS Homepage (noch alte Version)
Miniaturansicht angehängter Grafiken
luckiedips_215.jpg  
Angehängte Dateien
Dateityp: zip luckiedips3_2_100.zip (85,8 KB, 165x aufgerufen)
Ein Teil meines Codes würde euch verunsichern.
 
NicoDE
 
#31
  Alt 18. Feb 2005, 16:41
Wenn wir schon dabei sind, 64-Bit Support...

GetDesktopIconInfo()
Delphi-Quellcode:
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;
SetDesktopIconPos()
Delphi-Quellcode:
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;
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).


Gruss Nico

ps: für Unicode müsste man das Programm komplett umschreiben (habe Dateien mit japanischen Symbolen auf dem Desktop...)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#32
  Alt 18. Feb 2005, 16:52
Zitat von NicoDE:
Wenn wir schon dabei sind, 64-Bit Support...
Aber nicht mehr heute. Und testen kann ich es schon mal gar nicht. Dazu bräuchte ich ein Ferrari Notebook.

Zitat:
ps: für Unicode müsste man das Programm komplett umschreiben (habe Dateien mit japanischen Symbolen auf dem Desktop...)
Wir wollen aber nicht übertreiben oder?
Michael
  Mit Zitat antworten Zitat
NicoDE
 
#33
  Alt 18. Feb 2005, 16:55
Zitat von Luckie:
Und testen kann ich es schon mal gar nicht.
Ich war so frei

Zitat von Luckie:
Wir wollen aber nicht übertreiben oder?
War nur nen blöder Kommentar, sorry.

edit: Mail ist raus.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#34
  Alt 18. Feb 2005, 16:56
Kannst du mir die dpr-Datei schicken?
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#35
  Alt 18. Feb 2005, 23:50
So, jetzt läuft es auch unter 64-Bit Windows XP, dank Nico.
Michael
  Mit Zitat antworten Zitat
lkz633
 
#36
  Alt 19. Feb 2005, 00:20
Kannst du den neuen Quellcode mit Acticve Desktop Unterstützung hochladen?

Danke und Gruss
lkz633
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#37
  Alt 19. Feb 2005, 00:51
Ist doch schon oben.
Michael
  Mit Zitat antworten Zitat
lkz633
 
#38
  Alt 19. Feb 2005, 00:56
Ok, hatte die Einschränkung noch in der Readme gelesen

Zitat:
Einschränkungen : Funktioniert nicht bei aktivierten Active Desktop!
Klappt einwandfrei, danke

Gruss
lkz633
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#39
  Alt 19. Feb 2005, 01:02
Danke fürs Testen.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#40
  Alt 14. Mai 2006, 15:34
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.
Michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 10   « Erste     234 56     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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