我正在尝试使用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);
}
}
它找到 window 并将其放在前面。但鼠标单击不起作用。同样发送WM_CLOSE的作品。
鼠标单击有什么问题?
经过计算器和记事本测试。
坐标是相对于窗口的。
最佳答案
只是一个疯狂的猜测:click事件不应传递到主窗口,而应传递到目标按钮对象本身。在给定的坐标上,当发生真正的单击时,按钮位于主窗口上方,“隐藏”该窗口。