Startseite ¦  was ist neu ¦  programmier tips ¦  indy artikel ¦  intraweb artikel ¦  informationen ¦  links ¦  interviews ¦  sonstiges
kylix ¦  tutorials ¦  online shop ¦  fotos ¦  Add&Win Gewinnspiel


Willkommen Gast. Bitte einloggen oder registrieren.
21.05.2012, 12:00:34
Übersicht Hilfe Suche Einloggen Registrieren

+  SwissDelphiCenter Forum
|-+  German Forums
| |-+  WinAPI Forum
| | |-+  DIPS (Desktop-Icon-Position-Saver) by DaRoule
« vorheriges nächstes »
Seiten: [1] Drucken
Autor Thema: DIPS (Desktop-Icon-Position-Saver) by DaRoule  (Gelesen 2638 mal)
-=DaRoule=-
Gast
« am: 05.08.2002, 00:56:52 »

Hi,
Da ihr es ja alle nicht fertig gebracht habt, habe ich mir mal selbst geholfen und ein Besispiel gemacht:

Ich habe ein Problem mit dem folgendem Code den "ich selber" geschrieben habe (Save_DIP und Restore_DIP):

Code:

function GetDesktopListViewHandle: THandle;

var

  S: String;

begin

  Result := FindWindow('ProgMan', nil);

  Result := GetWindow(Result, GW_CHILD);

  Result := GetWindow(Result, GW_CHILD);

  SetLength(S, 40);

  GetClassName(Result, PChar(S), 39);

  if PChar(S) <> 'SysListView32' then Result := 0;

end;



procedure Save_DIP(wnd: HWND; AFile: string);

var

  cItems  : Integer;

  DIPFile : array[0..MAX_PATH] of DIP;

  F       : File of DIP;

  iLoop   : Integer;

  LVItem  : TLVItem;

  aIText  : array[0..MAX_PATH]of Char;

  ptIPos  : TPoint;

begin

{ Variablen initalisieren }

  ZeroMemory(@cItems, SizeOf(cItems));  // Item-Anzahl

  ZeroMemory(@DIPFile, SizeOf(DIPFile));  // Array of DIP-typ

  ZeroMemory(@aIText, SizeOf(AIText));  // CallBack BufferText

  ZeroMemory(@ptIPos, SizeOf(ptIPos));  // ItemPos

{ Dateihandle erzeugen }

  AssignFile(F, AFile);

{ Datei neu erzeugen }

  ReWrite(F);

{ Anzahl der Symbole herausbekommen }

  cItems := SendMessage(wnd, LVM_GETITEMCOUNT, 0, 0);

{ Anzahl der Wiederholungen auf null stellen }

  iLoop := 0;

{ in einer whileshleife die ganzen items durchgehen }

  while iLoop < cItems do

  begin

  { Alle Blöcke der Variable LVItem mit nullen (leeren) füllen }

    ZeroMemory(@LVItem, SizeOf(LVItem));

  { Textbuffer zuweisen }

    LVItem.pszText := @aIText[0];

  { Maximale Textlänge angeben }

    LVItem.cchTextMax := MAX_PATH;

  { Itemtext lesen }

    SendMessage(wnd, LVM_GETITEMTEXT, iLoop, LongInt(@LVItem));

  { Itemposition lesen }

    SendMessage(wnd, LVM_GETITEMPOSITION, iLoop, LongInt(@ptIPos));



  { DIP-Typ mit Daten füllen }

    DIPFile[iLoop].ItemName:=LVItem.pszText;

    DIPFile[iLoop].ItemPos:=ptIPos;

  { Daten in die Datei schreiben }

    Write(F, DIPFile[iLoop]);



  { Anzahl der Wiederholungen erhöhen }

    Inc(iLoop);

  end;

{ Dateihandle schließen }

  CloseFile(F);

end;



procedure Restore_DIP(wnd: HWND; AFile: string);

var

  DIPFile : array[0..MAX_PATH] of DIP;

  F       : File of DIP;

  iStyle  : Integer;

  iLoop   : DWORD;

  avName  : string;

  ptIPos  : TPoint;

  fIndex  : Integer;

  LVInfo  : TLVFindInfo;

begin

{ Variablen initalisieren }

  ZeroMemory(@iLoop, SizeOf(iLoop)); // Anzahl der wiederholungen

  ZeroMemory(@LVInfo, SizeOf(LVInfo)); // Suchinformationen

  ZeroMemory(@ptIPos, SizeOf(ptIPos)); // ItemPos

  ZeroMemory(@DIPFile, SizeOf(DIPFile));  // Array of DIP-typ

  ZeroMemory(@iStyle, SizeOf(iStyle)); // Desktop-Style

{ Dateihandle erzeugen }

  AssignFile(F, AFile);

{ Datei öffnen }

  {$I+} Reset(F); {$I-}

  if IOResult=NO_ERROR then

  begin

  { DosktopStyle abfragen (ob items automatisch angeordnet ... ) }

    iStyle:=GetWindowLong(wnd, GWL_STYLE);

    if (iStyle and LVS_AUTOARRANGE) <> 0 then

    begin

    { wenn ja das die automatische anordnung der items ausschalten }

      SetWindowLong(wnd, GWL_STYLE, iStyle and not LVS_AUTOARRANGE);

    end;

  { Datei nach items abfragen }

    while not Eof(F) do

    begin

    { Einen DIP-Block aus der Datei lesen }

      read(F, DIPFile[iLoop]);

    { Suchinformationen leeren }

      ZeroMemory(@LVInfo, DWORD(SizeOf(LVInfo)));

    { Itemtext in Variable zwischenspeichern }

      avName:=DIPFile[iLoop].ItemName;

    { Position übergeben }

      ptIPos:=DIPFile[iLoop].ItemPos;

    { Sagen das er nach dem Item Text suchen soll }

      LVInfo.flags:=LVFI_STRING;

    { ItemText übergeben }

      LVInfo.psz:=PChar(avName);

      fIndex := SendMessage(wnd, LVM_FINDITEM, -1, LongInt(@LVInfo));

      if fIndex <> -1 then

        SendMessage(wnd, LVM_SETITEMPOSITION, fIndex, MakeLong(ptIPos.x, ptIPos.y));  // MakeLong(ptIPos.x, ptIPos.y) bedeutet: ptIPos.x or (ptIPos.y shl 16)

    { Nach iStyle anordnen, geht auch ohne }

      SetWindowLong(wnd, GWL_STYLE, iStyle);

    { Anzahl der Wiederholungen erhöhen }

      Inc(iLoop);

    end;

  { Dateihandle schließen }

    CloseFile(F);

  end;

end;



Wenn ich der Function Save_DIP das Handle vom DesktopListView übergebe dann bekomme ich immer ein Fehler bei "LVM_GETITEMTEXT".
Nachdem er das ausgefürt hat geht es weiter aber ohne das ich den Text des Symboles habe !!!

Aber das beste ist ja: Wenn ich eine neues Prokekt erzeuge und darin ein TListView plaziere und ein paar Items reinschmeise und dann das Handle meines ListView's übergebe dann geht`s !!! das kann ja wohl nicht sein, oder ???

Ich habe WinXP Pro.

kann mir vieleicht jemand helfen ???
wäre jetzt echt wichtig, ist ja schon dumm denn ich habe diese Functionen jetzt extra geschrieben und es geht einfach nicht mit der DesktopListview-Handle.

Danke schon mal für eure Antworten.

PS.  für die, die nicht richtig gelesen haben: Bei dem Deskop-ListView funzt das ganze nicht !!!

Cu
DaRoule :-)
Gespeichert
Motzi
Jr. Member
**
Offline Offline

Beiträge: 80


60806961
WWW
« Antworten #1 am: 23.08.2002, 21:25:22 »

Das Problem ist, das die meisten Steuerelement-Nachrichten wie z.B. LVM_GETITEM und LVM_GETITEMPOSITION nicht über Prozessgrenzen hinweg arbeiten. Nachdem Windows dir also nicht die Arbeit abnimmt und die entsprechenden Infos in deinen Prozessraum mappt musst du eine Injekt-Dll in den fremden Prozessraum laden um dir die Infos zu holen.
Gespeichert

Gruß, Motzi - www.x-spy.net - das X-Spy Project
-=DaRoule=-
Gast
« Antworten #2 am: 24.08.2002, 02:05:49 »

Hi,

Also muss ich eine DLL erstellen in der die zwei Funktioen vorhanden sind und dann eine Message von meinem Programm an die DLL schicken das dann die Funktion aufruft, meinst du so etwas ???

Wenn nicht habe ich es nicht ganz verstanden was du meinst:

-> Nachdem Windows dir also nicht die Arbeit abnimmt und die entsprechenden Infos in deinen Prozessraum mappt musst du eine Injekt-Dll in den fremden Prozessraum laden um dir die Infos zu holen. <-

Bitte um weitere Hilfe.

Cu
DaRoule :-)
Gespeichert
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #3 am: 24.08.2002, 11:53:32 »

Man braucht nicht unbedingt eine Dll zu injecten.
Es geht auch mit VirtualAllocEx, ReadProcessMemory usw.

Siehe z.B das Beispiel, welches eine fremde ListView auslesen kann.
(für 9x/NT Platformen)

[a href="http://www.datavis.ch/thomas/Downloads/Delphi/GrabListView.zip" target="_blank"]http://www.datavis.ch/thomas/Downloads/Del...rabListView.zip[/a]


Vielliecht ist auch das NicoDIPS von Interesse:

"Dieses kleine Programm wurde geschrieben, um die Positionen der Symbole auf dem
Desktop speichern zu können. Beim Speichern werden die Positionen der Icons mit
ihrem Namen und Position in die Registry geschrieben. Bei Wiederherstellen wird
dann jedes Icon, dessen Name in der Registry gefunden wurde, an den alten Platz
verschoben. Dies funktioniert auch, wenn die automatische Ausrichtung aktiviert
ist. Es macht natürlich wenig Sinn, die Positionen wiederherzustellen, wenn die
Bildschirmauflösung kleiner ist, als beim Speichern. Die Position wird stets so gesetzt, wie sie vorher war (in Bildschirmkoordinaten)."

[a href="http://www.tkhobby.de/nicodips.zip" target="_blank"]http://www.tkhobby.de/nicodips.zip[/a]
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
-=DaRoule=-
Gast
« Antworten #4 am: 25.08.2002, 02:14:24 »

Hi,

Ich habe es jetzt mal mit VirtualAllocEx, ReadProcessMemory probiert habe aber nicht gescheites rausbekommen !

meinst du, du kannst mir mal ein kleinen Beispiel zeigen ??? (bitte,bitte :-) )

Hier ist der Type:

type
     DIP=record
       ItemName: string[255];
       ItemPos: TPoint;
     end;

Cu
DaRoule :-)
Gespeichert
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #5 am: 25.08.2002, 09:49:24 »

Ein Beispiel findest du unter obigem Link (GrabListView.zip )
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
-=DaRoule=-
Gast
« Antworten #6 am: 29.08.2002, 17:31:52 »

Hi, Thomas

Hatte jetzt mal zeit es auszuprobieren !
es hat gefunzt !

Ich habe noch ein bitte an die:

könntest du mir mal die Functionen und Proceduren rausschreiben die ich brauche damit das alles funktioniert ? Nur damit ich nicht immer diesen UNIT-Balst überall einbinden muss.

Ich habe es auch schon selber probiert, hat aber nicht gefunzt !

Cu
-=DaRoule=-
Gespeichert
Seiten: [1] Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS