gpt4 book ai didi

java - JNA 客户端到屏幕?

转载 作者:行者123 更新时间:2023-12-03 00:44:04 27 4
gpt4 key购买 nike

在弄清楚如何将 ClientToScreen winapi 函数与 JNA 结合使用时遇到问题。

我仍然得到窗口句柄坐标的 0, 0 输出。我引用了这个,但我确信我做得不对 https://msdn.microsoft.com/en-us/library/windows/desktop/dd183434(v=vs.85).aspx

    public interface User32Ex extends W32APIOptions {
User32Ex instance = (User32Ex) Native.loadLibrary("user32", User32Ex.class, DEFAULT_OPTIONS);
boolean GetCursorPos(long[] lpPoint);
WinDef.HWND WindowFromPoint(long point);
boolean GetClientRect(WinDef.HWND hWnd, WinDef.RECT rect);
boolean ClientToScreen(WinDef.HWND hWnd, int pt);
}



public void debug() throws InterruptedException {
while (true) {
long[] getPos = new long[1];
User32Ex.instance.GetCursorPos(getPos);
WinDef.HWND hwnd = User32Ex.instance.WindowFromPoint(getPos[0]);

WinDef.RECT rect = new WinDef.RECT();
User32Ex.instance.GetClientRect(hwnd, rect);
User32Ex.instance.ClientToScreen(hwnd, rect.left);
User32Ex.instance.ClientToScreen(hwnd, rect.right);

System.out.println(rect.toRectangle().toString());
Thread.sleep(1500);
}
}

最佳答案

@technomage 是对的。您需要在 ClientToScreen() 矩形参数中使用 WinDef.POINT 而不是 int

如果有人正在寻找该问题的可行解决方案,请参阅下面的内容。每 3 秒,它就会记录窗口内部客户端坐标桌面位置。

解释。

User32ForClientRect接口(interface)中,我们使用JNA加载user32.dll并定义了一些方法。我们不使用 JNA 接口(interface)中已实现的 User32 方法的原因很简单。我们的例子中需要的方法没有在 JNA 中实现。

方法:

  • FindWindow - 它包含在 JNA 中

    检索窗口句柄HWND

<小时/> <小时/>
  • ClientToScreen

    检索窗口内部客户端桌面位置。 左/上角坐标

<小时/>

示例:

package application.playground;

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

import java.awt.*;

public class ClientRectExample {
interface User32ForClientRect extends StdCallLibrary {
User32ForClientRect INSTANCE = Native.loadLibrary("user32", User32ForClientRect.class,
W32APIOptions.DEFAULT_OPTIONS);
WinDef.HWND FindWindow(String lpClassName, String lpWindowName);
boolean GetClientRect(WinDef.HWND hWnd, WinDef.RECT rect);
boolean ClientToScreen(WinDef.HWND hWnd, WinDef.POINT lpPoint);
}

public static void main(String[] args) {
while (true) {
try {
Rectangle rectangle = ClientRectExample.getClientRect("WindowName");
System.out.println(rectangle);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static Rectangle getClientRect(String startOfWindowName) {
WinDef.HWND hWnd = User32ForClientRect.INSTANCE.FindWindow(null, startOfWindowName);
WinDef.POINT getPos = new WinDef.POINT();
WinDef.RECT rect = new WinDef.RECT();
User32ForClientRect.INSTANCE.GetClientRect(hWnd, rect);
User32ForClientRect.INSTANCE.ClientToScreen(hWnd, getPos);

return new Rectangle(getPos.x, getPos.y, rect.right, rect.bottom);
}
}

关于java - JNA 客户端到屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32938784/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com