JNA: Zeiger an Struktur an SendMessage-Funktion von User32.dll als das LPARAM übergeben

Ich muss eine einfache Aufgabe ausführen: Die Namen der Listenansichtselemente in einem Explorer-Fenster ausdrucken. Angenommen, ich öffne "C: \ Dokumente und Einstellungen" auf meinem Desktop. Dann möchte ich ein Java-Programm schreiben, das JNA verwendet, um alle Namen der Ordner / Dateien im geöffneten Explorer-Fenster auszudrucken.

Was ich tun konnte: Holen Sie sich das Handle des geöffneten Explorer-Fensters und das Handle der darin enthaltenen Listenansicht.

Was ich herausgefunden habe: Ich muss die SendMessage-Funktion von User32.dll aufrufen und das Handle zusammen mit dem Nachrichtencode (der (0x1000 + 45) für LVM_GETITEMTEXTA ist) zusammen mit der 0 basierend an die oben gefundene Listenansicht übergeben Indexnummer des Listenansichtselements, dessen Name ich erhalten muss, und ein LPARAM (der ein langer Wert ist). Dieser LPARAM akzeptiert einen Zeiger auf eine Struktur vom Typ LVITEM. Sie können die Dokumentation der Nachricht hier beziehen:http://msdn.microsoft.com/en-us/library/windows/desktop/bb761055(v=vs.85).aspx

Ich habe die Struktur LVITEM in meiner Oberfläche für User32 wie folgt angelegt:

public static class LVITEM extends Structure
    {
        public short mask;
        public int iItem;
        public int iSubItem;
        public short state;
        public short stateMask;
        public char[] pszText;
        public int cchTextMax;
        public int iImage;
        public LPARAM lParam;
        public int iIndent;

        protected List getFieldOrder()
        {
            return Arrays.asList(new String[] { "mask", "iItem", "iSubItem", "state", "stateMask", "pszText", "cchTextMax", "iImage", "lParam", "iIndent" });
        }

    }

Meine Strukturinitialisierung sieht wie folgt aus:

User32.LVITEM lvItem = new User32.LVITEM(); //User32 is the name of the interface containing the LVITEM structure
lvItem.mask = 0x00000001; //code for LVIF_TEXT
lvItem.pszText= new char[260];
lvItem.iSubItem = 0;
lvItem.cchTextMax = 260;

Ich rufe die SendMessage-Funktion in einer for-Schleife auf, um die Namen aller Listenansichtselemente wie folgt zu drucken:

for(int j=0;j<nItems;j++)
{
lvItem.iItem= j;
LRESULT lrs = User32.INSTANCE.SendMessageA(handleToListView, (0x1000 + 45) , new WPARAM(j), new LPARAM(lvItem.getPointer().getLong(0)));
}

Wenn ich lvItem.getPointer (). GetLong (0) drucke, erhalte ich 0 anstelle eines langen Wertes, der den Zeiger darstellt.

Wenn ich lrs oder lvItem.pszText drucke, erhalte ich den Namen des Ordners nicht. Ich bekomme einen leeren Wert / 0.

Ich weiß, dass die JNA-Dokumentation besagt, dass ein Zeiger auf eine Struktur in JNA als Struktur behandelt wird. Aber wenn ich lvItem.getPointer nicht mache, wie kann ich dann die Struktur in einen langen Wert konvertieren, der als Argument für den LPARAM-Konstruktor erforderlich ist?

Was mache ich falsch? Bitte helfen Sie. Ich habe bereits viel Zeit mit Nachforschungen verbracht und seit ich neu bei JNA bin, konnte ich nicht verstehen, was falsch läuft.

Umgebung: Win XP Pro, JNA-Version: 3.4

Antworten auf die Frage(1)

Ihre Antwort auf die Frage