2015-11-14 2 views
-1

У меня много окон с одинаковыми именами, например калькулятор.Как я могу получить HWND из String?

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 в другой программе. Я знаю только значение String для HWND. Можно ли отличить [email protected] String to HWND?

Если да, то как я могу это сделать? Пожалуйста, помогите ..

+1

Почему вы преобразовываете указатель на строку в первую очередь? Прекратите это делать, и вам не нужно будет анализировать текст до указателя. –

+0

Я отправляю эту строку в flex app, где не указан указатель или класс hwnd. Мне нужно вызвать функции в Java из ActionScript для выполнения некоторых операций на hwnd. – Vishnu

+1

Итак, вы пытаетесь предоставить actioncript уникальными (строковыми) клавишами, с помощью которых вы можете ссылаться на родные окна? – 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 Ясно. Не сложно создать строковое представление без префикса. –

Смежные вопросы