Всем привет. Мне необходимо получить ID окон, под ID я подразумеваю какие то уникальные атрибуты окна, по которым я смогу выделить его из всех остальных и опросить, задача такая что нужно ловить нажатие пользователя на кнопку, с программами на си, делфи, асме все нормально, с программами на java, ничего не получается, куда не щелкни везде одни и теже цифры, код: Код (Text): DWORD GetWindowID( HWND hWnd ) { return GetWindowLongPtr( hWnd, GWL_ID ); } DWORD GetWindowID2( HWND hWnd ) { return GetWindowLongPtr( hWnd, GWL_STYLE ) + GetWindowLongPtr( hWnd, GWL_EXSTYLE ); } Я перехватываю TranslateMessage и по получению сообщения WM_LBUTTONDOWN, вывожу информацию в DbgView от GetWindowID и GetWindowID2, в яве куда не щелкни значения везде одинаковые, буду признателен за любую помощь, всякие другие вспомогательные ф-ции типа GetWindowRect итд пробовал. (:
baldr ну hWnd то да, я про параметры окна, по которым можно определить мой это hWnd или нет, но даже его не получается получить, получается получить только хендл главного окна, куда не щелкни, все указывает на него.
Наверно потому, что используются собственные контролы, которые рисуются самостоятельно, такое уже довольно часто встречается, в том же интернет эксплорере, например. Тут ты ничего не сделаешь так просто.
Ясно.Может либы какие то явовские или еще что то? Есть какое нибудь легальное решение для данной проблемы?
ilja_, Определить принадлежность hWnd конкретному процессу/потоку можно с помощью GetWindowThreadProcessId(). Конечно, могут быть замороченные сценарии (к примеру, нужное окно принадлежит локальному/удалённому COM-серверу), однако для простых случаев должно сработать. Можно попробовать привязаться к классу окна и его позиции в иерархии окон. Я так Diablo слегка автоматизировал.
baldr вы слегка не поняли что я имею ввиду. да как раз вопрос в том, что у него нет как такого hWnd, т.е. я не могу ни опросить его ни обратится к нему, ничего не могу, попробуйте в IE определите hWnd у какого нибудь TextEdit или кнопки, как уже писал Velheart в java так тоже не получится, поэтому и вопрос может есть какие нибудь либы явовские, хоть какая нибудь толковая информация, commerce можно и туда готов заплатить за решение/толковый совет и другую информацию по моей проблеме.
Вполне возможно. Без проблем. Запустил Spy++ из VS 2008, Alt+F3, взмах прицела и: Код (Text): Handle: 0001053A Caption: about:blank Class: Edit Style: 54000080 Rect: (107, 36)-(1041, 50) Или имеется в виду содержимое веб-страницы, которую IE показывает? Тогда это точно через OLE Automation/DOM (не зря я про COM заикнулся, похоже; использовать Windows-контролы на веб-странице… нонсенс?). Есть объект Shell.Application, можно его впотребить: Код (Text): sw = WScript.CreateObject("Shell.Application").Windows(); // берём коллекцию окон шелла for (i = 0; i<sw.Count; ++i) { // и перебираем её swfn = sw(i).FullName; // тут имя файла-образа процесса if ("\\iexplore.exe"==swfn.substring(swfn.length-13) && "http://www.ya.ru/"==sw(i).Document.location.href) { // наша окошка! form = sw(0).Document.forms(0); // форма там одна edit = form(0); // а вот инпутов несколько WScript.Echo('Зря искал "'+edit.value+'". Будет тебе щастье! ;-)'); // шутка edit.value = "сочные девч0нки"; // для разрядки во всём мире form.submit(); // Огонь! } } Запущать, естественно, при открытом дзен-яндексе в IE через cscript имя файла.js Надеюсь, идея ясна.
baldr Спасибо за помощь, но там ведь не ие, если натравить spy++ на какой нить приложение написано на java, то он там везде будет показывать одно и тоже, и получить тексты текст едитов, кнопок итд, не получится и даже COM там не поможет
ilja_, Дык, а я о чём. Если интересует содержимое окна, рисуемого программой самостоятельно (например текст Word-овского документа), надо искать подходцы. Честно говоря, реверсом Java не занимался, так что следующая ссылка может оказаться выстрелом в молоко. А Java-программа секретная? Я бы глянул, для общего развития.