2015-11-14 105 views
-1

我有很多同名的窗口,例如计算器。如何从字符串中获取HWND?

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的字符串值。 是否可以将[email protected]字符串转换为HWND?

如果是的话我该怎么做?请帮忙..

+1

你为什么首先将指针转换为字符串?停止这样做,你不需要将文本解析回指针。 –

+0

我将这个字符串发送到flex应用程序,其中没有定义指针或hwnd类。我必须从actionscript调用Java中的函数才能在hwnd上执行一些操作。 – Vishnu

+1

所以你试图提供独特的(字符串)键与您可以参考本机窗口的动作? – technomage

回答

0
String hwndString = "[email protected]"; 
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 
} 
+0

我仍然不明白你为什么从指针转换为字符串,然后再回来,为什么你用'native @'作为前缀。你的答案是纯Java。 –

2

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

如果实际上问题在于您将文本发送给其他方,并且需要获取窗口句柄的数值,那么只需将文本转换为数字值即可。我在[email protected]前缀文本中看不到点,而十六进制前缀0x可能也是多余的。双方可以简单地同意该值总是以十六进制形式传递。据推测,您对Java和其他涉及到能够在数值和十六进制文本之间进行转换的编程语言有足够的了解。

+2

'native @ 0xXXXX'作为JNA的本机指针的字符串表示形式发出。 – technomage

+0

@technomage很明显。不难创建没有前缀的字符串表示。 –

相关问题