JavaとJNA(Java Native Access)を使用してWindows APIと対話する方法を学習しようとしていますが、ロードブロックです。 SendInput(...)
メソッドは、イベントが正常にキューに入れられたことを示す1を返しますが、マウス自体は何もしません。マウス入力ストリームでマウスイベントをキューイングしてマウスに何かを行わせると、コードが機能します。マウスの移動方法(または何かを行う方法)
マイSSCCE:
編集: dwFlagsパラメータフィールドに入力するように編集。私は定数のいくつかの組み合わせを試してみました。ここでも、それが機能する方法を示唆しなければならないようSendInputメソッドは1を返しますが、マウスではびくともしません:
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.platform.win32.WinUser.*;
import com.sun.jna.win32.StdCallLibrary;
public class MouseUtils {
public interface User32 extends StdCallLibrary {
public static final long MOUSEEVENTF_MOVE = 0x0001L;
public static final long MOUSEEVENTF_VIRTUALDESK = 0x4000L;
public static final long MOUSEEVENTF_ABSOLUTE = 0x8000L;
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
DWORD SendInput(DWORD dWord, INPUT[] input, int cbSize);
}
public static void main(String[] args) {
INPUT input = new INPUT();
input.type = new DWORD(INPUT.INPUT_MOUSE);
input.input.mi.dx = new LONG(500);
input.input.mi.dy = new LONG(500);
input.input.mi.mouseData = new DWORD(0);
input.input.mi.dwFlags = new DWORD(User32.MOUSEEVENTF_MOVE
| User32.MOUSEEVENTF_VIRTUALDESK | User32.MOUSEEVENTF_ABSOLUTE);
// input.input.mi.dwFlags = new DWORD(0x8000L);
input.input.mi.time = new DWORD(0);
INPUT[] inArray = {input};
int cbSize = input.size(); // mouse input struct size
DWORD nInputs = new DWORD(1); // number of inputs
DWORD result = User32.INSTANCE.SendInput(nInputs , inArray, cbSize);
System.out.println("result: " + result); // return 1 if the 1 event successfully inserted
}
}
編集2:より多くの読み取りを行う
、それは私の理解と思われますJNAを使用した配列は不完全であり、配列は単に連続したメモリ領域へのポインタであるC配列に関して考える必要があります。もっと来てください(私は願っています!)。
Offtopic:それは常にあなたが、素敵なリラックスした人々との友好されて見て喜びです。あなたは私が本当にここで調べている人の一人です。ハッピーホリデー;素晴らしい年2017! – GhostCat
@GhostCat:あなたの最初のステートメントはやや面白いですが、2番目のステートメントはあまりにも親切です。そして、私はあなた、あなたの能力、そしてあなたの知識を他の人に伝えるあなたの欲望を見上げます。 –