java - How can I call GetRawInputDeviceInfo using JNA? -
i want call getrawinputdeviceinfo java application using jna.
this jna library
interface looks like:
public static final uint ridi_deviceinfo = new uint(0x2000000b); public static dword rim_type_keyboard = new dword(1); public static class rid_device_info extends structure { public dword cbsize; public dword dwtype; public rid_device_info_ riddeviceinfo_; @override protected list<string> getfieldorder() { return aslist("cbsize", "dwtype", "riddeviceinfo_"); } } public static class rid_device_info_ extends structure { public rid_device_info_mouse mouse; public rid_device_info_keyboard keyboard; public rid_device_info_hid hid; @override protected list<string> getfieldorder() { return aslist("mouse", "keyboard", "hid"); } } public static class rid_device_info_mouse extends structure { public dword dwid; public dword dwnumberofbuttons; public dword dwsamplerate; public bool fhashorizontalwheel; @override protected list<string> getfieldorder() { return aslist("dwid", "dwnumberofbuttons", "dwsamplerate", "fhashorizontalwheel"); } } public static class rid_device_info_keyboard extends structure { public dword dwtype; public dword dwsubtype; public dword dwkeyboardmode; public dword dwnumberoffunctionkeys; public dword dwnumberofindicators; public dword dwnumberofkeystotal; @override protected list<string> getfieldorder() { return aslist("dwtype", "dwsubtype", "dwkeyboardmode", "dwnumberoffunctionkeys", "dwnumberofindicators", "dwnumberofkeystotal"); } } public static class rid_device_info_hid extends structure { public dword dwvendorid; public dword dwproductid; public dword dwversionnumber; public ushort ususagepage; public ushort ususage; @override protected list<string> getfieldorder() { return aslist("dwvendorid", "dwproductid", "dwversionnumber", "ususagepage", "ususage"); } } public uint getrawinputdeviceinfo(handle hdevice, uint uicommand, pointerbyreference pdata, intbyreference pcbsize);
then, use getrawinputdeviceinfo
this: (assume hdevice
valid handle
obtained somewhere.)
uint uicommand = ridi_deviceinfo; rid_device_info deviceinfo = new rid_device_info(); deviceinfo.cbsize.setvalue(deviceinfo.size()); pointerbyreference pdata = new pointerbyreference(deviceinfo.getpointer()); intbyreference pcbsize = new intbyreference(deviceinfo.size()); uint lresult = instance.getrawinputdeviceinfo(hdevice, uicommand, pdata, pcbsize);
my problem lresult -1 getrawinputdeviceinfo's documentation says indicates pdata
not large enough device info. did define pdata
or cbsize
incorrectly? if so, correct way define them in case?
my jna version 4.1.0. application running on java 8 on windows 7 64-bit.
at least need modify structure have proper representation. have 3 individual fields instead should have union
. make structure's size larger intended.
in addition, should pass structure directly third argument (using pointerbyreference
not incorrect, native code receive address of pointer rather address of structure). when passing structure directly, jna knows when needs sync java fields native memory.
public interface deviceaccess extends stdcalllibrary { public static class rid_device_info extends structure { public int cbsize; public int dwtype; public rid_device_info_ riddeviceinfo_; // ensure active field corresponds read native memory protected void read() { super.read(); type = rid_device_info_hid.class; switch(dwtype) { case rid_device_info_mouse: type = rid_device_info_mouse.class; break; case rid_device_info_keyboard: type = rid_device_info_keyboard.class; break; default: break; } riddeviceinfo_.settype(type); } @override protected list<string> getfieldorder() { return aslist("cbsize", "dwtype", "riddeviceinfo_"); } } public static class rid_device_info_ extends union { public rid_device_info_mouse mouse; public rid_device_info_keyboard keyboard; public rid_device_info_hid hid; } public uint getrawinputdeviceinfo(handle hdevice, uint uicommand, rid_device_info pdata, intbyreference pcbsize); }
then use this:
uint uicommand = ridi_deviceinfo; rid_device_info deviceinfo = new rid_device_info(); // put in constructor deviceinfo.cbsize = deviceinfo.size(); intbyreference pcbsize = new intbyreference(deviceinfo.size()); uint lresult = instance.getrawinputdeviceinfo(hdevice, uicommand, deviceinfo, pcbsize);
Comments
Post a Comment