 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 28.02.2008, 13:25 Titel: Positionen von Desktop Icons |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 28.02.2008, 22:16 Titel: |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 29.02.2008, 16:06 Titel: |
|
|
Das scheint tatsächlich machbar zu sein, aber eine komplizierte Kiste.
Hier in PureBasic tanzen die Items auf dem Desktop.
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 |
|
 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 01.03.2008, 20:25 Titel: |
|
|
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 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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 04.03.2008, 14:35 Titel: |
|
|
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 |
|
 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 04.03.2008, 21:02 Titel: |
|
|
Ah das ist ja nett, dass es dann tortzdem ganz nett ist
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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 05.03.2008, 10:16 Titel: |
|
|
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.  _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 05.03.2008, 17:56 Titel: |
|
|
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 |
|
 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 20.03.2008, 14:34 Titel: |
|
|
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
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
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 |
|
 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 21.03.2008, 19:31 Titel: |
|
|
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
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 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
Meinen Desktop hab ich auch soweit wieder hinbekommen...
Gruß Gorgon _________________ Who is general failure
and why is he reading my harddisk? |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 21.03.2008, 21:28 Titel: |
|
|
I.d.R. hilft hier keiner nicht, weil es "zu einfach" ist.
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.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
|
|
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.
|
|