Получение текста элемента с помощью JNA и SendMessage()

Я пытаюсь получить текст элемента из элемента управления, подобного Win32 ListView. Я использую JNA и SendMessageW() для отправки LVM_GETITEMTEXTW в элемент управления. Мне удалось получить количество элементов (через LVM_GETITEMCOUNT), но на данный момент я в тупике. Мой класс User32 настроен так:

public interface MyUser32 extends User32 {

    MyUser32 INSTANCE = (MyUser32)Native.loadLibrary("user32", MyUser32.class);
    LRESULT SendMessageW(HWND hWnd, int msg, WPARAM wParam, LVITEM lParam); 

}

Мой класс LVITEM настроен так:

public class LVITEM extends Structure{


    public LVITEM() {
        pszText = new Memory(MEMSIZE);
        cchTextMax = MEMSIZE;
    }

    private static final int MEMSIZE = 256;

    public UINT mask;
    public int iItem;
    public int iSubItem;
    public UINT state;
    public UINT stateMask;
    public Pointer pszText;
    public int cchTextMax;
    public int iImage;
    public LPARAM lParam;
    public int iIndent;

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

И код, который вызывает все это, выглядит так:

MyUser32 u32 = MyUser32.INSTANCE;   
LVITEM lvItem = new LVITEM();
WPARAM wPar = new WPARAM(1);

...

lvItem.iSubItem = 0;
res = u32.SendMessageW(handle, LVM_GETITEMTEXTW, wPar, lvItem);

System.out.println(res.intValue());
s = lvItem.pszText.getString(0);        
System.out.println(s);

Я пропустил часть кода, но я считаю, что это важные части. Моя проблема в том, что когда я распечатываю res.intValue(), он всегда равен 0 (это означает, что текст не возвращался), а когда я распечатываю строковое значение pszText, это всегда какие-то символы мусора. Я полностью озадачен в этот момент, поэтому любые предложения очень ценятся. Спасибо.


person Bren    schedule 23.05.2013    source источник
comment
Я предполагаю, что LVM_GETITEMTEXTW означает юникод (по сравнению с ascii), поэтому как минимум вам нужно запросить широкую строку из вашей lvItem.psxText памяти.   -  person technomage    schedule 24.05.2013
comment
Спасибо за предложение, которое, вероятно, решает еще одну проблему, с которой я столкнулся бы в будущем. Я действительно решил опубликовать здесь, основываясь на ваших комментариях по другому вопросу от февраля: stackoverflow.com/questions/14975347/ Я следил некоторые из предложений по этой ссылке, но ничего из того, что я делаю, похоже, не имеет значения. Если это поможет, я также использую этот сайт MSDN в качестве ссылки: msdn.microsoft.com/en-us/library/windows/desktop/   -  person Bren    schedule 24.05.2013
comment
Вероятно, вам нужно установить для маски ненулевое значение, чтобы указать, какие поля структуры вы хотите/действительны.   -  person technomage    schedule 24.05.2013
comment
Теперь я использовал Spy++, чтобы посмотреть, что на самом деле отправляется в элемент управления, и это мусор, поэтому похоже, что проблема связана со структурой LVITEM или с тем, как она отправляется в SendMessageW. Четвертый аргумент SendMessageW — это LPARAM, который должен быть указателем на структуру LVITEM. Я правильно его передаю?   -  person Bren    schedule 24.05.2013
comment
Соответствует ли указатель на стороне Java тому, что видит Spy++? Если да, соответствует ли дамп памяти структуры Java (jna.dump_memory=true и вызов Structure.toString()) какой-либо части того, что видит Spy++?   -  person technomage    schedule 26.05.2013
comment
Когда я вызываю lvItem.toString(), он отображает тот же адрес памяти, что и в Spy++. Все настройки правильно отображаются в консоли Eclipse, но в Spy++ значения совершенно другие.   -  person Bren    schedule 28.05.2013