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

标签 java winapi tooltip jna

我开始尝试使用 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/

相关文章:

c - 在恢复线程时将参数传递给线程。 (WinAPI)

c++ - 任务托盘中没有图标的窗口怎么办?

c++ - 通过从 C/C++ 调用 Windows API 函数来生成独立的汇编子例程

java - 从 JComboBox 渲染器获取工具提示

css - 使用 css 不显示工具提示框

css - 如何自定义 dojo 工具提示标签

java - 如何向 JTextarea 添加文本而不删除它之前的文本? java

java - 语句中的 ')'有什么需要

java - 从 Firebase 获取最后(5 或 10)个值

java - 使用普通应用程序作为 Android 启动器