【问题标题】:Mouse click with JNA鼠标点击 JNA
【发布时间】:2012-02-15 12:44:29
【问题描述】:

我正在尝试使用 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 Robot来完成。您是否可以选择继续使用您的 JNA 来查找窗口,然后将其置于前面并然后使用简单的 Java 机器人来模拟点击?
  • 机器人移动真实的光标,真的很烦人。它还要求目标窗口不与其他东西重叠。但是使用 PostMessage,即使窗口位于背景中,也无需移动光标,也可以使用。
  • a) “机器人移动真实的光标,真的很烦人” [原文如此] 使用机器人,您可以:保存鼠标位置、移动鼠标​​、单击、向后移动鼠标到老位置。它是如此之快,用户甚至都看不到它(去过那里,做到了;)b)“它要求目标窗口不与其他东西重叠” [原文如此]你说你带来了你的窗户到前面? (在大多数情况下,一旦一扇窗户在前面,它就在前面......虽然我同意在某些情况下可能还有一些东西甚至更“在前面”,但这应该是非常罕见的不是!?
  • 我知道什么是机器人,我可以想象许多关于鼠标点击和模拟其他事件的不同解决方法。但是机器人仍然是不可靠的解决方法。是的,在这个例子中,窗口在前面,机器人可以正常工作。但在实际应用程序中,窗口可以在后台。双击也可能需要更多时间,而且不会那么快。如果应用程序需要一系列点击和其他操作,则可能需要一些时间。我在这个项目中已经有了 JNA,它可以向任何窗口发送任何消息。

标签: java jna


【解决方案1】:

只是一个大胆的猜测:点击事件不应该传递到主窗口,而是传递到目标按钮对象本身。在给定的坐标上,按钮位于主窗口上方,在发生真正的点击时“隐藏”它。

【讨论】:

  • 是的,你完全正确。我已经在不基于 Windows 组件的应用程序上对其进行了测试:netbeans、firefox 并且工作正常。要单击计算器中的按钮,它需要找到按钮组件并将消​​息直接发送给它。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 2014-01-15
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多