私はJNAのウィンドウでマウスのクリックをシミュレートしようとしています。JNAでマウスをクリック
public class App {
public static final int WM_LBUTTONUP = 514;
public static final int WM_LBUTTONDOWN = 513;
public static final int WM_LBUTTONDBLCLK = 0x203;
static int WM_CLOSE = 0x10;
final static String winTitle = "Untitled - Notepad";
public static void main(String[] args) throws InterruptedException {
User32Extra user32 = (User32Extra) Native.loadLibrary("user32", User32Extra.class, W32APIOptions.DEFAULT_OPTIONS);
WinDef.HWND hwnd = user32.FindWindow(null, winTitle);
user32.SetForegroundWindow(hwnd);
Thread.sleep(1000);
long y = 77 + (22 << 16);//x + (y << 16)
WinDef.LPARAM l = new WinDef.LPARAM(y);
WinDef.WPARAM w = new WinDef.WPARAM(0);
user32.PostMessage(hwnd, WM_LBUTTONDOWN, w, l);
Thread.sleep(1000);
user32.PostMessage(hwnd, WM_LBUTTONUP, w, l);
}
}
ウィンドウを見つけて前面に表示します。マウスクリックは機能しません。 WM_CLOSEも送信します。 マウスクリックで何が問題になっていますか? 電卓とメモ帳でテスト済みです。 座標はウィンドウに対して相対的です。
+1 ...純粋なJavaでは(少なくとも別のアプリケーションに属するウィンドウではないにしても)ウィンドウの位置を見つけて前面に移動することはできないので、ここではJNAは素晴らしいですが... Javaロボットを使用して実行できます。ウィンドウを見つけてJNAを使用して、それをフロントに持ってきて、クリックをシミュレートするために単純なJavaロボットを使用するオプションはありますか? – TacticalCoder
ロボットが実際のカーソルを動かすと、本当に面倒です。また、ターゲットウィンドウが他のものと重なっていないことが必要です。しかしPostMessageでは、カーソルが動かずにウィンドウがバックグラウンドのどこかにあっても動作します。 – NullPointer
a)*ロボットが実際のカーソルを動かすと本当に迷惑です。* [sic]ロボットでは、マウスの位置を保存し、マウスを移動し、クリックし、元の場所に戻します。それは非常に速いので、ユーザーはそれを見ていない(そこにいて、それをした;)b)* "それはターゲットウィンドウが他のものと重なっていないことを要求する" * [sic] (ほとんどの場合、ウィンドウが前面に来たら、それは前面にあります...私はいくつかのケースではまだ前にあるものがもっとあるかもしれませんが、これは珍しいものではありません! – TacticalCoder