Java 如何从字符串中获取HWND?

Java 如何从字符串中获取HWND?,java,winapi,jna,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() { @O

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

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());
}
final HashMap hm=new HashMap();
User32.INSTANCE.EnumWindows(新User32.WNDENUMPROC(){
@凌驾
公共布尔回调(指针hWnd、指针arg){
HWND hWnd2=新的HWND(HWND);
字节[]windowText=新字节[512];
GetWindowTextA(hWnd,windowText,512);
字符串wText=Native.toString(windowText.trim();
如果(!wText.isEmpty()&&User32.INSTANCE.IsWindowVisible(hWnd2)&&wText.equals(“计算器”)){
hm.put(hWnd2,wText);
}
返回true;
}
},空);
用于(HWND-HWND:hm.keySet()){
System.out.println(hwnd.toString());
}
上面的脚本将输出为

native@0x20816

native@0x50362

native@0x1206ae

我无法在其他程序中访问此哈希映射。我只知道HWND的字符串值。 是否可以强制转换
native@0x20816
字符串到HWND


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

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


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

首先,为什么要将指针转换为字符串?停止这样做,您将不需要将文本解析回指针。我正在将此字符串发送到未定义指针或hwnd类的flex应用程序。我必须从actionscript调用Java中的函数来在hwnd上执行一些操作。因此,您试图为actionscript提供唯一(字符串)键,您可以使用这些键引用本机窗口?是(用于唯一标识窗口)
native@0xXXXX
由JNA以本机指针的字符串表示形式发出。@technomage。但是,创建没有前缀的字符串表示并不困难。我仍然无法理解为什么要从指针转换为字符串,然后再转换回来,为什么要使用
native@
作为前缀。你的答案是纯Java。
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
}