Я пытаюсь получить текст элемента из элемента управления, подобного 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, это всегда какие-то символы мусора. Я полностью озадачен в этот момент, поэтому любые предложения очень ценятся. Спасибо.
LVM_GETITEMTEXTW
означает юникод (по сравнению с ascii), поэтому как минимум вам нужно запросить широкую строку из вашейlvItem.psxText
памяти. - person technomage   schedule 24.05.2013jna.dump_memory=true
и вызовStructure.toString()
) какой-либо части того, что видит Spy++? - person technomage   schedule 26.05.2013