JNA: передать указатель на структуру функции SendMessage для User32.dll в качестве LPARAM
Мне нужно выполнить простую задачу: распечатать имена элементов списка в окне обозревателя. Предположим, я открываюC: \ Documents and Settings " на моем рабочем столе я хочу написать java-программу, использующую JNA для распечатки всех имен папок / файлов в открытом окне проводника.
Что я смог сделать: получить дескриптор открытого окна проводника и дескриптор списка в нем.
Что я обнаружил: мне нужно вызвать функцию SendMessage для User32.dll и передать ее дескриптор представлению списка, указанному выше, вместе с кодом сообщения (который (0x1000 + 45) для LVM_GETITEMTEXTA), а также на основе 0 порядковый номер элемента представления списка, имя которого мне нужно получить, и LPARAM (который является длинным значением). Этот LPARAM будет принимать указатель на структуру типа LVITEM. Вы можете обратиться к документации сообщения здесь:http://msdn.microsoft.com/en-us/library/windows/desktop/bb761055(v=vs.85).aspx
Я создал структуру LVITEM в своем интерфейсе для User32 следующим образом:
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" });
}
}
Моя структура инициализации выглядит следующим образом:
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;
Я вызываю функцию SendMessage внутри цикла for, чтобы напечатать имена всех элементов представления списка следующим образом:
for(int j=0;j