Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Positionen von Desktop Icons

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 28.02.2008, 13:25    Titel: Positionen von Desktop Icons Antworten mit Zitat

Hi..
ich versuche schon länger die Positionen von Desktop Icons zu erhalten.
Dazu lasse ich mir erstmal das Handle zu dem ListView Teil auf dem Desktop zurück geben...
So mit ListView_GetItemPosition(handle des ListView, Index zum gewünschten Element, Pointer zur POINT Struc) kann ich mir nun die Daten zu einem bestimmten Element in die Adresse, auf die der POINT Ptr verweist schreiben lassen.

Jetzt hab ich aber ein dickes Problem.. dieser Pointer ist natürlich eine Virtuelle Adresse des Explorer Prozesses zu dieser Struktur. Ist ja auch logisch, weil ja dieses ListView-Teil auf dem Desktop auch zum Explorer Prozess gehört.
Ich kann also nicht so ohne weiteres darauf zugreifen.
Aber wie könnte ich es denn jetzt trotzdem machen?

Ich hatte gedacht, dass ich erstmal den Prozess mit Open Process öffne...
Anschließend mir mit VirtualAllocEx den nötigen Speicher für diese Struc im Explorerprozess reserviere und den dann wieder mit ReadProcessMemory auslesen kann?!

Aber irgendwie will das nicht so recht. Die virtuelle Adresse ist immer null. Ich glaube das hängt mit diesen blöden Rechten zusammen.
Könnt ihr mir erklären wie ich das genau machen kann? Also Speicher Reservieren, nötige Rechte setzten um dann aus/in diesen fremden Prozesspeicher zu lesen/schreiben...

Ist mein Ansatz überhaupt machbar, oder geht das nur mit einer Dll Injection?

Gruß Georg

EDIT: Oh sorry.. habs jetzt doch noch hinbekommen. Habe es so gemacht wie beschrieben... (also ich kann den Speicher auslesen, ob ich rein schreiben kann weiß ich noch nicht, weil ich keine Zeit mehr dazu hab)

Habs mal in NoPaste reingetan...
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=489
_________________
Who is general failure
and why is he reading my harddisk?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 28.02.2008, 22:16    Titel: Antworten mit Zitat

Als grosser VBScriptler und Windows Script Host-Benützer ist mir nur

http://msdn2.microsoft.com/en-us/library/xk6kst2k(VS.85).aspx

bekannt. Explizit eine X- und Y-Koordinate einer .lnk-Datei zuweisen ist mir soweit nicht bekannt. So viel ich weiss, speichert Windows dies alles in der desktop.ini-Datei.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 29.02.2008, 16:06    Titel: Antworten mit Zitat

Das scheint tatsächlich machbar zu sein, aber eine komplizierte Kiste. mit den Augen rollen
Hier in PureBasic tanzen die Items auf dem Desktop. lächeln

Noch 'n Hinweis:
schau mal die tlhelp32.bi an, erspart dir einige Deklarationen,
und ZString *40 reicht hier:
Code:
Function GetDesktopListViewHandle( ) As HANDLE
  Dim TempHandle As HANDLE
  Dim ClassName As ZString *40
  TempHandle = FindWindow("ProgMan", NULL)
  TempHandle = GetWindow(TempHandle, GW_CHILD) 'Child.. Handle zu SHELLDLL_DefView
  TempHandle = GetWindow(TempHandle, GW_CHILD) 'Child.. Handle zu SysListView32
  'Auf Fehler überprüfen
  If GetClassName(TempHandle, @ClassName, 39) = 0 Then TempHandle = NULL
  If ClassName <> WC_LISTVIEW Then TempHandle = NULL
  Return TempHandle
End Function

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 01.03.2008, 20:25    Titel: Antworten mit Zitat

Hi..
habs grad ganz eilich.. will aber das hier noch los werden:
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=490

Desktop Icons sind in diesem ListView Teil drin. Über die Desktop Ini wäre, falls möglich, das ganze wahrscheinlich noch langsamer..

Volta.. hatte noch keine Zeit größer was am Code zu ändern... werd ich aber noch machen zwinkern Bei mir ist grad ABI Stress oO

Viele Grüße,
_Gorgon

PS: Ich hafte nicht für unaufgeräumte Desktops!
_________________
Who is general failure
and why is he reading my harddisk?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 04.03.2008, 14:35    Titel: Antworten mit Zitat

Jo, ganz nett. Nur funktioniert das Prog nicht, weil es auf meinen Rechnern keine "process.bi" gibt- und zwar auf allen dreien!
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 04.03.2008, 21:02    Titel: Antworten mit Zitat

Ah das ist ja nett, dass es dann tortzdem ganz nett ist zwinkern

Jaja, sorry ich habs versemmelt! Die prozess.bi hatte ich mir angelegt (da standen die deklarationen für ProcessNext etc. drin und ich hatte vergessen sie vor dem posten noch schnell in den Quellcode zu tun)
Na jetzt weiß ich ja, dass man die ganzen deklarationen auch über die tlhelp32.bi bekommt..
Kommt davon wenn mans ganz eilich hat und trotzdem noch im Internet rumwühlt!

So habst jetzt NOCHMAL hochgeladen:
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=492

Und beachtet bitte die Hinweise am Anfang des Codes sonst funktionierts wieder nicht! Ich arbeite daran das zu ändern..

Gruß Gorgon
_________________
Who is general failure
and why is he reading my harddisk?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 05.03.2008, 10:16    Titel: Antworten mit Zitat

Ok, jetzt läßt es sich wenigstens compilieren. Aber passieren tut nicht viel. Es erscheint eine DOS-Box mit der Zeile "Press any key tu quit", und das wr's. Mein Desktop sieht immer noch schön geordnet aus. grinsen zwinkern
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 05.03.2008, 17:56    Titel: Antworten mit Zitat

Zitat:
Und beachtet bitte die Hinweise am Anfang des Codes sonst funktionierts wieder nicht! Ich arbeite daran das zu ändern..


Und..? Also bei mir gehts!

Gruß _Gorgon
_________________
Who is general failure
and why is he reading my harddisk?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 20.03.2008, 14:34    Titel: Antworten mit Zitat

Das Automatisch Anorden habe ich nun deaktiviert mit folgendem Code:

Code:
Sub Check_LVS_Settings(hList As HWND, hParentLV As HWND)
   
   Dim WStyle As Long  = GetWindowLong(hList, GWL_STYLE)

   If (WStyle And LVS_AUTOARRANGE) > 0 Then      
       SendMessage(hParentLV, WM_COMMAND, IDM_TOGGLEAUTOARRANGE, 0)
   End If

End Sub


IDM_TOGGLEAUTOARRANGE ist eine konstante:
Code:
#Define IDM_TOGGLEAUTOARRANGE &h7051
#Define LVS_AUTOARRANGE &h100


Das funktioniert auch. Hab die Konstanten ausm Internet...

So.. wenn ich nun das gleiche mit dem "Am Raster ausrichten" Menüpunkt versuche, dann habe ich da meine Probleme:

Also:
Code:
Sub Check_LVS_Settings(hList As HWND, hParentLV As HWND)
   
   Dim WStyle As Long  = GetWindowLong(hList, GWL_STYLE)   
   Dim LVStyle As Long = SendMessage(hList, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)      
   
   If (WStyle And LVS_AUTOARRANGE) > 0 Then      
      SendMessage(hParentLV, WM_COMMAND, IDM_TOGGLEAUTOARRANGE, 0)
   End If
      
   If (LVStyle And LVS_EX_SNAPTOGRID) > 0 Then
      SendMessage(hParentLV, WM_COMMAND, IDM_TOGGLESNAPTOGRID, 0)      
   End If
   
End Sub


Die Abfrage If (LVStyle And LVS_EX_SNAPTOGRID) > 0 Then [... ] funktioniert zwar einwandfrei, aber mir fehlt die Methode, wie ich diesen Menüpunkt wieder deaktivieren könnte?!

Habt ihr eine Idee, wie ich das machen könnte?! IDM_TOGGLESNAPTOGRID hab ich frei erfunden. Einen Wert dazu weiß ich nicht. Hab einfach mal &h5C10 genommen, weil der Wert LVStyle ohne den Haken am Menüpunkt &h5C10 und mit &h805C10 ist?!

Aber irgendwie haben die Werte beim Autoarrange auch überhaupt nichts miteinander zu tun.. Die Bits von WStyle haben mit IDM_TOGGLEAUTOARRANGE überhaupt nichts gemein und trotzdem funktionierts..
also irgendwie verwundert

Die meißten meiner Informationen hab ich von hier:
http://www.delphipraxis.net/topic103069,0,asc,15.html&sid=a8dcb706f46ca97c5a50e0370d017ff7

Nur bei der entscheidenden Frage für mich hört der Thread auf^^

Danke schonmal lächeln

Gruß Gorgon

EDIT: Hier nochmal das gesamte Problem..
Code:
#Include Once "windows.bi"
#Include Once "win/commctrl.bi"

#Define IDM_TOGGLEAUTOARRANGE &h7051
#Define LVS_EX_SNAPTOGRID &h80000
#Define IDM_TOGGLESNAPTOGRID &h5C10

Declare Function    DebugUniqueLength         (As String, As Integer) As String
Declare Sub       Check_LVS_Settings         (As HWND, As HWND)
Declare Function    GetDesktopListViewHandle   ( ) As HANDLE

Dim hDesk       As HWND   = GetDesktopWindow( )
Dim hList       As HWND   = GetDesktopListViewHandle( )
Dim hParentLV   As HWND     = GetParent(hList)

Do

   Cls
   Check_LVS_Settings(hList, hParentLV)   
   Sleep 100
   
Loop Until Len(InKey) > 0

End

Sub Check_LVS_Settings(hList As HWND, hParentLV As HWND)
   
   Dim WStyle As Long  = GetWindowLong(hList, GWL_STYLE)   
   Dim LVStyle As Long = SendMessage(hList, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)
      
   Print DebugUniqueLength(Bin(LVS_AUTOARRANGE), 32);
   Print " <- LVS_AUTOARRANGE"
   Print DebugUniqueLength(Bin(IDM_TOGGLEAUTOARRANGE), 32);
   Print " <- IDM_TOGGELAUTOARRANGE"   
   Print DebugUniqueLength(Bin(WStyle), 32);
   Print " <- WStyle"
   Print DebugUniqueLength(Bin(WStyle And LVS_AUTOARRANGE), 32);
   Print " <- WStyle And LVS_AUTOARRANGE"   
   Print DebugUniqueLength(Bin(WStyle And IDM_TOGGLEAUTOARRANGE), 32);
   Print " <- WStyle And IDM_TOGGLEAUTOARRANGE"
   
   If (WStyle And LVS_AUTOARRANGE) > 0 Then      
      'SendMessage(hParentLV, WM_COMMAND, IDM_TOGGLEAUTOARRANGE, 0)
      Print "LVS_AUTOARRANGE"
   End If
   
   Print
   Print DebugUniqueLength(Bin(LVS_EX_SNAPTOGRID), 32);
   Print " <- LVS_EX_SNAPTOGRID"
   Print DebugUniqueLength(Bin(LVStyle), 32);
   Print " <- LVStyle"   
   Print DebugUniqueLength(Bin(LVStyle And LVS_EX_SNAPTOGRID), 32);
   Print " <- LVStyle And LVS_EX_SNAPTOGRID"   
   Print DebugUniqueLength(Bin(LVStyle And IDM_TOGGLESNAPTOGRID), 32);
   Print " <- LVStyle And IDM_TOGGLESNAPTOGRID"
   
   If (LVStyle And LVS_EX_SNAPTOGRID) > 0 Then
      'SendMessage(hParentLV, WM_COMMAND, IDM_TOGGLESNAPTOGRID, 0)      
      Print "LVS_EX_SNAPTOGRID"
   End If
   
End Sub

Function DebugUniqueLength(Text As String, CharNum As Integer) As String
   
   If Len(Text) < CharNum Then
      Text = Space(CharNum - Len(Text)) + Text
   End If
   Return Text
   
End Function

Function GetDesktopListViewHandle( ) As HANDLE
   
   Dim TempHandle As HANDLE
   Dim ClassName As ZString * 40
   
   TempHandle = FindWindow("ProgMan", NULL)
   TempHandle = GetWindow(TempHandle, GW_CHILD) 'Child.. Handle zu SHELLDLL_DefView
   TempHandle = GetWindow(TempHandle, GW_CHILD) 'Child.. Handle zu SysListView32
   
   'Auf fehler überprüfen
   If GetClassName(TempHandle, @ClassName, 39) = 0 Then TempHandle = NULL
   If ClassName <> "SysListView32" Then TempHandle = NULL   
      
   Return TempHandle
   
End Function

_________________
Who is general failure
and why is he reading my harddisk?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
_Gorgon



Anmeldungsdatum: 04.01.2008
Beiträge: 16
Wohnort: Heidelberg

BeitragVerfasst am: 21.03.2008, 19:31    Titel: Antworten mit Zitat

mmmhhh.. sagt mal! Wisst ihrs nicht oder wollt ihr es nicht sagen, weil es zu einfach ist?

Also ich habs jetzt auf die Methode brutal gelöst grinsen

Eine kleine Schleife die mir alle möglichen Werte von 0 bis Nirvana durchläuft und diese per SendMessage(hList, WM_COMMAND, X, 0) durchprobiert hat. Einer hat dann funktioniert:
Code:
#Define IDM_TOGGLESNAPTOGRID &h7054


Was zwischendurch noch passiert ist könnt ihr euch sicher denken^^
Es ging total ab grinsen es wurde der Desktopbereinigungassistent ausgeführt, dann wurden die Icons sehr seltsam^^ und zwischendruch kamen verschiedene Fehlermeldungen oder es war einfach mal alles grau!

Naja.. hauptsache ich hab jetzt diesen Wert zwinkern
Meinen Desktop hab ich auch soweit wieder hinbekommen...

Gruß Gorgon
_________________
Who is general failure
and why is he reading my harddisk?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 21.03.2008, 21:28    Titel: Antworten mit Zitat

I.d.R. hilft hier keiner nicht, weil es "zu einfach" ist. zwinkern
Sollte mal keine Antwort kommen, weiß es meist keiner.

In deinem Falle hätte ich die Holzhammer-Methode aber wenigstens in einer VM ausgeführt und nicht auf meinem normalen Rechner. durchgeknallt
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz