Доброго времени суток, уважаемые коллеги.
Прошу помощи по вопросу, над которым бьюсь уже второй день.
Пишу тестирующее приложение, выполняющее функциональные тесты над десктоп приложением. Со временем, надеюсь, данные наработки превратятся в полноценный фреймоврк - обертку над Win32 API, если будет время довести его до ума. Для доступа к Win32 функциям использую JNA (java native access) либу.
Столкнулся со следующей задачей, которая оказалась на практике довольно-таки нетривиальной, - нужно разобрать комбобокс на ListBox, Array ListItem’ов и т.д., а выполнить в Win32 это можно следующими способами:
-
вызовом BOOL GetComboBoxInfo(In HWND hwndCombo, Out PCOMBOBOXINFO pcbi)
-
вызовом BOOL SendMessageA(In hWnd, CB_GETCOMBOBOXINFO, 0, Out PCCOMBOBOXINFO pcbi)
т.е. одним из этих вызовов заполняется структура COMBOBOXINFO, которая и будет содержать заветные HWND списка и т.д.
Ниже отрывки из кода
Описание структуры COMBOBOXINFO ( COMBOBOXINFO (winuser.h) - Win32 apps | Microsoft Learn ):
COMBOBOXINFO.java
public class COMBOBOXINFO extends Structure
{
public int cbSize;
public RECT rcItem;
public RECT rcButton;
public int stateButton;
public HWND hwndCombo;
public HWND hwndItem;
public HWND hwndList;
/**
* Constructs new instance
*/
public COMBOBOXINFO()
{
super();
cbSize = size();
}
public List<?> getFieldsList()
{
return getFields(true);
}
@Override
protected List<?> getFieldOrder()
{
return Arrays.asList(new String[] {"cbSize", "hwndCombo", "hwndItem", "hwndList", "rcButton", "rcItem", "stateButton"} );
}
}
Класс WindowsHelper - слой-обертка над Win32 API функциями (вернее, его кусок)
public class WindowHelper
{
private static final int CB_GETCOMBOBOXINFO = 0x0164;
private interface User32Ex extends User32
{
User32Ex INSTANCE = (User32Ex)Native.loadLibrary("user32.dll", User32Ex.class, W32APIOptions.DEFAULT_OPTIONS);
boolean SendMessageA(HWND hWnd, int msg, int wParam, COMBOBOXINFO cbi);
boolean GetComboBoxInfo(HWND hWnd, COMBOBOXINFO cbi);
}
/**
*
* Defines extended interface with additional methods
* for calling corresponding Win32 functions
*/
private static final User32Ex _user32Instance = User32Ex.INSTANCE;
....................................................
}
Делаю вызовы следующим способом:
some_function(HWND hWnd /* хендл окна комбобокса */)
{
COMBOBOXINFO cbi = new COMBOBOXINFO();
boolean res = _user32Instance.GetComboBoxInfo(hWnd, cbi);
или
boolean res = _user32Instance.SendMessageA(hWnd, CB_GETCOMBOBOXINFO, 0, cbi);
}
И проблема в следующем: хотя и передается правильный хендл окна ComboBox, в обоих случаях функции возвращают false и, соответственно, поля структуры не заполнены.
Может кто-то уже сталкивался с подобной проблемой или библиотекой JNA по-больше сможет направить на путь истинный. Копия вопроса на stackoverflow http://stackoverflow.com/questions/25388066/populating-comboboinfo-structure-by-using-jna , но пока без результата
Thanks in advance.