2015-11-14 129 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很明顯。不難創建沒有前綴的字符串表示。 –