我有许多同名的窗口,例如计算器。
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?
如果是这样我该怎么办?请帮忙..
答案 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
}