2012-02-15 3 views
4

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가 전송됩니다. 마우스 클릭의 문제점은 무엇입니까? 계산기 및 메모장에서 테스트되었습니다. 좌표는 창에 상대적입니다.

+0

+1 ... 순수한 자바에서는 윈도우의 위치를 ​​찾아서 앞으로 가져올 수 없습니다 (적어도 다른 응용 프로그램에 속한 윈도우가 아닌 경우). JNA는 훌륭하지만 마우스 클릭은 Java Robot을 사용하여 수행 할 수 있습니다. JNA를 계속 사용하여 창을 찾은 다음 그것을 앞으로 가져 와서 간단한 Java 로봇을 사용하여 클릭을 시뮬레이션 할 수 있습니까? – TacticalCoder

+0

로봇이 실제 커서를 움직이면 정말 짜증납니다. 또한 대상 창이 다른 것과 겹치지 않아야합니다. 그러나 PostMessage를 사용하면 커서가 움직이지 않고 창문이 배경에있는 경우에도 작동합니다. – NullPointer

+0

a) * "로봇이 실제 커서를 움직이고 실제로 성가시다"* 로봇으로 마우스 위치 저장, 마우스 이동, 클릭, 이전 위치로 마우스 이동. 너무 빨라서 사용자는 그것을 보지 못할 것입니다. (거기에 있었고 그렇게했습니다.) b) "대상 창이 다른 것과 겹치지 않아야합니다."* [sic] 창문을 앞에 가져 왔다고 했습니까? (대부분의 경우 창문이 앞에 있으면 앞에 있습니다 ... 어떤 경우에는 여전히 "앞에서"더 많은 것이있을 수 있지만 이것은 희귀 한 것보다 더 많을 것입니다 !? – TacticalCoder

답변

1

단순한 추측 : 클릭 이벤트는 기본 창으로 전달되지 않고 대상 버튼 객체 자체에 전달되어야합니다. 주어진 좌표에서 버튼은 실제 클릭이 발생할 때이를 숨기는 기본 창 위에 있습니다.

+0

예, 당신은 절대적으로 옳습니다. Windows 구성 요소를 기반으로하지 않는 응용 프로그램에서 netbeans, firefox 및 그 응용 프로그램을 테스트했습니다. 계산기에서 단추를 클릭하려면 단추 구성 요소를 찾아 메시지를 직접 보내야합니다. 감사합니다. – NullPointer

관련 문제