gpt4 book ai didi

java - 使用 JNA 从 Windows 访问工具提示

转载 作者:太空宇宙 更新时间:2023-11-04 07:25:54 25 4
gpt4 key购买 nike

我开始尝试使用 JNA 来访问 Windows 中的每个工具提示。为此,我不断向窗口发送 TTM_GETTOOLINFO 消息。下面是我的代码...

public class Test {

public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
HWND GetForegroundWindow(); // add this
int SendMessageA(HWND hwnd, int msg, int num1, TOOLINFO f );
// int SendMessageW(HWND hwnd, int msg, int num1, TOOLINFO f );
}


public class TOOLINFO extends Structure
{
public int cbSize;
public int uFlags;
public HWND hwnd;
public UINT_PTR uId;
public RECT rect;
public HINSTANCE hinst;
public char [] lpszText;

TOOLINFO()
{
lpszText = new char[512];
}
}

public static void main(String[] args)
{
new Test().go();
}

public void go()
{
TOOLINFO tt = new TOOLINFO();
int WM_USER = 0x0400;
HWND hwnd ;
int i=0;
while(true)
{
hwnd= User32.INSTANCE.GetForegroundWindow();
try
{
i=User32.INSTANCE.SendMessageA(hwnd,WM_USER+8, 0, tt);
}
catch(Exception ex)
{
ex.printStackTrace();
}
if(i!=0)
System.out.println("Tooltip :"+tt.lpszText);
}
}
}

但它不起作用。我使用的是window 8。我在网上找到了两个版本的commctrl.h。一种显示 TTM_GETTOOLINFOA= WM_USER+8 TTM_GETTOOLINFOW= WM_USER+53,另一种显示 TTM_GETTOOLINFOA= WM_USER+9 TTM_GETTOOLINFOW= WM_USER+54。然而,我尝试了 SendMessageA 和 W 的每种组合。所以我认为存在一些根本性错误。所以任何人都可以同样帮助我。从 JNA 访问工具提示。

public class JnaTest2 {

public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
HWND GetForegroundWindow(); // add this
int SendMessageW(HWND hwnd,int msg ,WPARAM w,TOOLINFOW lparam);
}
public class TOOLINFOW extends Structure
{
public int cbSize;
public int uFlags;
public HWND hwnd;
public UINT_PTR uId;
public RECT rect;
public HINSTANCE hinst;
public Pointer pszText = new Memory(512);
LPARAM l;
Pointer lpReserved=null;
}
public static void main(String[] args)
{

new JnaTest2().go();
}
public void go()
{
int WM_USER = 0x0400;
TOOLINFOW tt = new TOOLINFOW();
tt.cbSize=tt.size();
System.out.println(tt.size());
HWND hwnd ;
int j=0;
while(true)
{
hwnd=User32.INSTANCE.GetForegroundWindow();
tt.hwnd=hwnd;
try
{
j=User32.INSTANCE.SendMessageW(hwnd,WM_USER+53,new WPARAM(0),tt);
}
catch(Exception ex)
{
ex.printStackTrace();
}
if(j!=0)
System.out.println("Tooltip :"+tt.pszText.getString(0));

}
}

}

最佳答案

  • 使用TTM_GETTOOLINFOW .
  • 使用SendMessageW .
  • 初始化 TOOLINFOhWndcbSize 字段。lpszText 必须是指针类型,而不是内联数组。您可以使用Memory,字段类型为Pointer。确保它足够大。
  • 您缺少 lParam(类型 LPARAM)和 lpReserved(类型 Pointer)字段。

编辑您的问题以显示您如何实现这些内容以及相应的结果。

编辑

检查Native.getLastError()以查看方法调用是否导致错误。它不会抛出异常。

关于java - 使用 JNA 从 Windows 访问工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557456/

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