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 ... 순수한 자바에서는 윈도우의 위치를 찾아서 앞으로 가져올 수 없습니다 (적어도 다른 응용 프로그램에 속한 윈도우가 아닌 경우). JNA는 훌륭하지만 마우스 클릭은 Java Robot을 사용하여 수행 할 수 있습니다. JNA를 계속 사용하여 창을 찾은 다음 그것을 앞으로 가져 와서 간단한 Java 로봇을 사용하여 클릭을 시뮬레이션 할 수 있습니까? – TacticalCoder
로봇이 실제 커서를 움직이면 정말 짜증납니다. 또한 대상 창이 다른 것과 겹치지 않아야합니다. 그러나 PostMessage를 사용하면 커서가 움직이지 않고 창문이 배경에있는 경우에도 작동합니다. – NullPointer
a) * "로봇이 실제 커서를 움직이고 실제로 성가시다"* 로봇으로 마우스 위치 저장, 마우스 이동, 클릭, 이전 위치로 마우스 이동. 너무 빨라서 사용자는 그것을 보지 못할 것입니다. (거기에 있었고 그렇게했습니다.) b) "대상 창이 다른 것과 겹치지 않아야합니다."* [sic] 창문을 앞에 가져 왔다고 했습니까? (대부분의 경우 창문이 앞에 있으면 앞에 있습니다 ... 어떤 경우에는 여전히 "앞에서"더 많은 것이있을 수 있지만 이것은 희귀 한 것보다 더 많을 것입니다 !? – TacticalCoder