【问题标题】:How can I get HWND from String?如何从字符串中获取 HWND?
【发布时间】:2015-11-14 04:52:05
【问题描述】:

我有很多同名的窗口,例如计算器。

User32Extra.INSTANCE.FindWindow(null,"Calculator")

上面的脚本给了我找到的第一个计算器的 HWND。

我已使用 EnumWindows 查找所有 HWND。

final HashMap<HWND,String> hm=new HashMap<HWND,String>();  
User32.INSTANCE.EnumWindows(new User32.WNDENUMPROC() {

     @Override
     public boolean callback(Pointer hWnd, Pointer arg) {
         HWND hWnd2 = new HWND(hWnd);
        byte[] windowText = new byte[512];
        User32.INSTANCE.GetWindowTextA(hWnd, windowText, 512);
        String wText = Native.toString(windowText).trim();

        if (!wText.isEmpty() && User32.INSTANCE.IsWindowVisible(hWnd2) && wText.equals("Calculator")) {
            hm.put(hWnd2,wText);
        }
        return true;
     }
  }, null);

for(HWND hwnd:hm.keySet()){
   System.out.println(hwnd.toString());
}

上面的脚本给出的输出为

native@0x20816

native@0x50362

native@0x1206ae

我无法在另一个程序中访问此 HashMap。我只知道 HWND 的字符串值。 是否可以将native@0x20816 String 转换为 HWND?

如果是这样,我该怎么做?请帮忙..

【问题讨论】:

  • 你为什么首先将指针转换为字符串?停止这样做,您将不需要将文本解析回指针。
  • 我将此字符串发送到未定义指针或 hwnd 类的 flex 应用程序。我必须从 actionscript 调用 Java 中的函数才能在 hwnd 上执行一些操作。
  • 所以您正在尝试为 actionscript 提供可以引用本机窗口的唯一(字符串)键?
  • 是(用于唯一识别窗口)

标签: java winapi jna


【解决方案1】:

如果您完全在这个 Java 程序中编码,那么将窗口句柄转换为文本表示是没有意义的。只需直接使用HWND 值。

如果实际上问题是您将文本发送给其他方,并且需要获取窗口句柄的数值,那么只需将文本转换为数值即可。我认为用native@ 为文本添加前缀没什么意义,而十六进制前缀0x 可能也是多余的。双方可以简单地同意该值将始终以十六进制形式传递。大概您对 Java 和其他涉及能够在数值和十六进制文本之间进行转换的编程语言有足够的了解。

【讨论】:

  • native@0xXXXX 被 JNA 作为本地指针的字符串表示形式发出。
  • @technomage 很清楚。不过,创建一个没有前缀的字符串表示并不难。
【解决方案2】:
String hwndString = "native@0xa021c";
HWND temp = new HWND();
temp.setPointer(new Pointer(Long.decode(hwndString.substring(7))));
if(User32.INSTANCE.IsWindow(temp)){
     //This is a valid window
}
else{
     // Invalid Window
}

【讨论】:

  • 我仍然无法理解为什么你从指针转换为字符串然后再转换回来,为什么你前缀native@。你的答案是纯 Java。
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2011-11-30
  • 2017-07-28
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多