如何从String中获取HWND?

时间:2015-11-14 04:52:06

标签: java winapi jna

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

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());
}

上面的脚本将输出显示为

  

天然@ 0x20816

     

天然@ 0x50362

     

天然@ 0x1206ae

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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
}