LVM_GETITEMCOUNT

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von C.O.D.E.

    LVM_GETITEMCOUNT

    Hallo,

    da ich gelesen habe das der Desktop nur ein ListView ist wollte ich versuchen mir die Anzahl der Dateien anzeigen zu lassen. Dies versuche ich mit LVM_GETITEMCOUNT und Sendmessage. Ich lese zuerst die HWND von dem Desktop aus und sende dann mit Sendmessage den Befehl LVM_GETITEMCOUNT hin. Leider bekomme ich immer 0 als Response.

    Was mache ich falsch?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
    3. Private Declare Auto Function GetDesktopWindow Lib "user32.dll" () As IntPtr
    4. Private Const LVM_FIRST = &H1000
    5. Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 100)
    6. Dim DESKHWND As Integer
    7. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. DESKHWND = GetDesktopWindow()
    9. MessageBox.Show(DESKHWND)
    10. MessageBox.Show(SendMessage(DESKHWND, LVM_GETITEMCOUNT, 0, 0))
    11. End Sub
    12. End Class


    Ich habe gelesen das LVM_First immer 100 ergeben muss. Deswegen habe ich das so gemacht.

    Ich hatte ein Example in C# wo es so gelöst wurde:

    C#-Quellcode

    1. var numberOfIcons = (int)Win32.SendMessage(_desktopHandle, Win32.LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero);


    Ich möchte später noch die Positionen von den Dateien und Verknüpfungen Speichern deswegen über Sendmessage!
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Deine Quellen?
    Laut MSDN musst Du z.B. sicherstellen, dass Deine App auf 64-Bit eingestellt ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    In meinem Projekt steht meine Ziel-CPU auf x64. Deinen verlinkten Artikel habe ich bereits gelesen und beziehe mich in erster Linie auf diese Beispiele: codeproject.com/Articles/63948…Icon-Positions-on-Desktop

    Leider Funktioniert es auch mit x64 nicht!
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    C.O.D.E schrieb:

    da ich gelesen habe das der Desktop nur ein ListView ist
    Inwieweit ist diese Aussage gesichert?
    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!
    @RodFromGermany, gesichert denke ich gar nicht.

    Da ich aber einen funktionierenden C# Code gefunden habe der dies behauptet
    und darauf auch aufbaut, dachte ich eigentlich sollte diese Information stimmen.

    -> codeproject.com/Articles/63948…Icon-Positions-on-Desktop

    PInvoke
    I Googled again and found that actually desktop is a ListView control inside some process. And anyone can send messages to this control using standard SendMessage API of Windows.
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „C.O.D.E“ ()

    @C.O.D.E Leider habe ich gerade mit CodeProject ein paar Anzeigeprobleme, ich werde das mal zu Hause probieren.
    Wenn der Code nicht funktioniert kann das auch ein Indiz dafür sein, dass MS ggf. unter Win10 die Philosophie geändert hat und der Code halt nur für Win7 geht.
    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!
    Der Fehler lag hier in GetDesktopWindow.

    Ich habe das ganze über umwege gelöst und es funktioniert Perfekt.

    Der Code:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Private Const LVM_GETITEMCOUNT As UInteger = &H1004
    4. <DllImport("user32", EntryPoint:="FindWindow", SetLastError:=True)>
    5. Private Shared Function FindWindow(ByVal className As String, ByVal windowName As String) As IntPtr
    6. End Function
    7. <DllImport("user32", EntryPoint:="FindWindowEx", SetLastError:=True)>
    8. Private Shared Function FindWindowEx(ByVal parent As IntPtr, ByVal childAfter As IntPtr, ByVal className As String, ByVal windowName As String) As IntPtr
    9. End Function
    10. <DllImport("User32", EntryPoint:="SendMessage", SetLastError:=True)>
    11. Private Shared Function SendMessage(ByVal handle As IntPtr, ByVal message As UInteger, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    12. End Function
    13. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    14. Dim desktopHandle As IntPtr = FindWindow("Progman", "Program Manager")
    15. desktopHandle = FindWindowEx(desktopHandle, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
    16. desktopHandle = FindWindowEx(desktopHandle, IntPtr.Zero, "SysListView32", "FolderView")
    17. Dim itemCount As Integer = SendMessage(desktopHandle, LVM_GETITEMCOUNT, 0, 0)
    18. MessageBox.Show(itemCount)
    19. End Sub
    20. End Class
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!