Eigenschaften eines Desktop Symbol auslesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Eigenschaften eines Desktop Symbol auslesen

    Hallo ,
    ich lese mittels API alle Positionen des Desktop Icons aus.

    Jetzt zu meinem Problem, ist es möglich die Eigenschaften eines Symbols deren Name ich nicht kenne mittels der Position auszulesen?

    Also zb. ein Ordner oder eine Datei liegt am Desktop mit der Position 410x990. Von diesem Ordner (Datei) möchte ich gerne die Eigenschaften auslesen.

    Hoffe ihr könnt mir helfen.

    Grüße TM
    @Toolmaster Wenn der Desktop frei ist, kannst Du per Software die Maus an dieser Position klicken lassen und hast so ein markiertes Icon.
    Ob das so funktioniert weiß ich nicht, aber schau mal hier rein:
    dotnet-snippets.de/snippet/dat…verknuepfung-auslesen/248
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo erstmal!

    Soweit ich weiß werden all diese Attribute in der Windows-Registry gespeichert.
    Du müsstest nur herausfinden wie du die Registry ausliest und wo, welchen Wert!

    Ich habe mir mal erlaubt das World Wide Internetz zu zerlegen und stieß dann auf die folgende Zeichenkette: "HKEY_CURRENT_USER/Software/Microsoft/Windows/Shell/Bags/1/Desktop"
    Dort sollten augenscheinlich dann all die Werte für die verschiedenen Desktop-Elemente aufgelistet sein und auch ein Schlüssel namens ItemPos!

    Ich kann dir aber nicht Versichern, dass dies der genaue Weg für deine spezifische Windows-Distribution ist, da Windows öfters mal gerne was ändert.
    Somit könnten auch die Schlüsselwerte pfadtechnisch ihre Plätze gewechselt haben!

    Durchsuche mal einfach den Registry-Cluster und suche nach "desktop", "shell" oder "bags" und solltest auch irgendwann schon fündig werden.

    Leider kann ich nicht für dich nachsehen, da ich vor ein paar Wochen auf Linux umgestiegen bin, aber du solltest auf jeden fall mal einen Anhaltspunkt haben!

    Grüße
    ~ Elanda
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------
    Hallo,
    ich verfolge jetzt einen neuen weg um die Namen der Desktop Icons zu ermitteln.

    VB.NET-Quellcode

    1. ​Imports System.Runtime.InteropServices
    2. Imports System.Text
    3. Imports System.Windows.Automation
    4. Public Class Form1
    5. <DllImport("user32.DLL")>
    6. Public Shared Function FindWindowEx(ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    7. End Function
    8. <DllImport("user32.dll")>
    9. Public Shared Function EnumWindows(lpEnumFunc As EnumWindowsProc, lParam As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    10. End Function
    11. Public Delegate Function EnumWindowsProc(hWnd As IntPtr, lParam As IntPtr) As Boolean
    12. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    13. Public Shared Function GetClassName(hWnd As IntPtr, lpClassName As StringBuilder, nMaxCount As Integer) As Integer
    14. End Function
    15. Public Function GetDesktopHandle() As IntPtr
    16. Dim DesktopHandle As IntPtr = IntPtr.Zero
    17. EnumWindows(Function(WorkerW_Handle, OptionalParameter)
    18. Dim HandleToString = New StringBuilder(256)
    19. GetClassName(WorkerW_Handle, HandleToString, HandleToString.Capacity)
    20. If HandleToString.ToString = "WorkerW" Or HandleToString.ToString = "Progman" Then
    21. Dim Attachment_Folder As IntPtr = FindWindowEx(WorkerW_Handle, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
    22. If Attachment_Folder <> IntPtr.Zero Then
    23. Dim Desktop_Folder As IntPtr = FindWindowEx(Attachment_Folder, IntPtr.Zero, "SysListView32", "FolderView")
    24. If Desktop_Folder <> IntPtr.Zero Then
    25. DesktopHandle = Desktop_Folder
    26. Return False ' False bedeutet das der Desktop gefnden wurde und die Suche beendet ist.
    27. End If
    28. End If
    29. End If
    30. Return True ' Desktop wurde noch nicht gefunden. Die Suche fortsetzen.
    31. End Function, IntPtr.Zero)
    32. Return DesktopHandle
    33. End Function
    34. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    35. Dim el As AutomationElement = AutomationElement.FromHandle(GetDesktopHandle())
    36. Dim walker As TreeWalker = TreeWalker.ContentViewWalker
    37. Dim child As AutomationElement = walker.GetFirstChild(el)
    38. While child IsNot Nothing
    39. ListBox1.Items.Add(child.Current.Name)
    40. ' MsgBox(child.Current.ClassName)
    41. child = walker.GetNextSibling(child)
    42. End While
    43. End Sub
    44. End Class


    Die namen bekomme ich auch bzw. den angezeigten Text. Könnte mir jetzt wer weiterhelfen wie ich mit dem AutomationElement die Datei Eigenschaften auslesen kann.

    Danke schon mal im Voraus.
    @Toolmaster Klicken musst Du schon. Geht auch per API.
    Siehe Link in Post #2.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!