получить id окна у программы написаной на java

Тема в разделе "WASM.BEGINNERS", создана пользователем ilja_, 7 сен 2010.

  1. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    Всем привет.
    Мне необходимо получить ID окон, под ID я подразумеваю какие то уникальные атрибуты окна, по которым я смогу выделить его из всех остальных и опросить, задача такая что нужно ловить нажатие пользователя на кнопку, с программами на си, делфи, асме все нормально, с программами на java, ничего не получается, куда не щелкни везде одни и теже цифры, код:

    Код (Text):
    1. DWORD GetWindowID( HWND hWnd )
    2. {
    3.     return GetWindowLongPtr( hWnd, GWL_ID );
    4. }
    5.  
    6. DWORD GetWindowID2( HWND hWnd )
    7. {
    8.     return GetWindowLongPtr( hWnd, GWL_STYLE ) + GetWindowLongPtr( hWnd, GWL_EXSTYLE );
    9. }
    Я перехватываю TranslateMessage и по получению сообщения WM_LBUTTONDOWN, вывожу информацию в DbgView от GetWindowID и GetWindowID2, в яве куда не щелкни значения везде одинаковые, буду признателен за любую помощь, всякие другие вспомогательные ф-ции типа GetWindowRect итд пробовал. (:
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    ilja_,

    А сам hWnd чем плох?
     
  3. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    baldr
    ну hWnd то да, я про параметры окна, по которым можно определить мой это hWnd или нет, но даже его не получается получить, получается получить только хендл главного окна, куда не щелкни, все указывает на него.
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Наверно потому, что используются собственные контролы, которые рисуются самостоятельно, такое уже довольно часто встречается, в том же интернет эксплорере, например. Тут ты ничего не сделаешь так просто.
     
  5. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    Ясно.Может либы какие то явовские или еще что то?
    Есть какое нибудь легальное решение для данной проблемы?
     
  6. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    ilja_,

    Определить принадлежность hWnd конкретному процессу/потоку можно с помощью GetWindowThreadProcessId(). Конечно, могут быть замороченные сценарии (к примеру, нужное окно принадлежит локальному/удалённому COM-серверу), однако для простых случаев должно сработать.

    Можно попробовать привязаться к классу окна и его позиции в иерархии окон. Я так Diablo слегка автоматизировал.
     
  7. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    baldr
    вы слегка не поняли что я имею ввиду.

    да как раз вопрос в том, что у него нет как такого hWnd, т.е. я не могу ни опросить его ни обратится к нему, ничего не могу, попробуйте в IE определите hWnd у какого нибудь TextEdit или кнопки, как уже писал Velheart в java так тоже не получится, поэтому и вопрос может есть какие нибудь либы явовские, хоть какая нибудь толковая информация, commerce можно и туда :) готов заплатить за решение/толковый совет и другую информацию по моей проблеме.
     
  8. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Вполне возможно.

    Без проблем. Запустил Spy++ из VS 2008, Alt+F3, взмах прицела и:
    Код (Text):
    1. Handle:  0001053A
    2. Caption: about:blank
    3. Class:   Edit
    4. Style:   54000080
    5. Rect:    (107, 36)-(1041, 50)
    Или имеется в виду содержимое веб-страницы, которую IE показывает? Тогда это точно через OLE Automation/DOM (не зря я про COM заикнулся, похоже; использовать Windows-контролы на веб-странице… нонсенс?). Есть объект Shell.Application, можно его впотребить:
    Код (Text):
    1. sw = WScript.CreateObject("Shell.Application").Windows(); // берём коллекцию окон шелла
    2. for (i = 0; i<sw.Count; ++i) { // и перебираем её
    3.   swfn = sw(i).FullName; // тут имя файла-образа процесса
    4.   if ("\\iexplore.exe"==swfn.substring(swfn.length-13) && "http://www.ya.ru/"==sw(i).Document.location.href) {
    5.     // наша окошка!
    6.     form = sw(0).Document.forms(0); // форма там одна
    7.     edit = form(0); // а вот инпутов несколько
    8.     WScript.Echo('Зря искал "'+edit.value+'". Будет тебе щастье! ;-)'); // шутка
    9.     edit.value = "сочные девч0нки"; // для разрядки во всём мире
    10.     form.submit(); // Огонь!
    11.   }
    12. }
    Запущать, естественно, при открытом дзен-яндексе в IE через cscript имя файла.js

    Надеюсь, идея ясна.
     
  9. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    baldr
    :)
    Спасибо за помощь, но там ведь не ие, если натравить spy++ на какой нить приложение написано на java, то он там везде будет показывать одно и тоже, и получить тексты текст едитов, кнопок итд, не получится и даже COM там не поможет :)
     
  10. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    ilja_,

    Дык, а я о чём. Если интересует содержимое окна, рисуемого программой самостоятельно (например текст Word-овского документа), надо искать подходцы. Честно говоря, реверсом Java не занимался, так что следующая ссылка может оказаться выстрелом в молоко.

    А Java-программа секретная? Я бы глянул, для общего развития. :derisive: