Сейчас на форуме: Rio, tyns777, zombi-vadim (+5 невидимых)

 eXeL@B —› Программирование —› подскажите порядок команд по разбору содержимого окна класса DirectUIHWND
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 26 августа 2012 17:38
· Личное сообщение · #1

возьмем пример окна "Мой компьютер" в виндовс хр. левая часть окна является DirectUIHWND. как можно прочитать его содержимое? а потом еще и выбрать определенный пункт? ссылку http://wmsdk.com/2009/07/09/directui-iaccessible/ не предлагать, потому как китайская грамота...

нужен порядок команд, с помощью которого можно достучаться до содержимого окошка. с классом SysListView32 все получилось замечательно - читаю, выбираю. а вот в 7 виндовсе мое целевое окошко DirectUIHWND, и из-за этого затык... 4000 строчек кода и висит уже который месяц.

насколько я понял:
1. сначала нужно найти хэндл окошка - это есть
2. проверить на доступность AccessibleObjectFromWindow - это есть, возвращает S_OK
3. посчитать количество child - есть, но видимо работает не верно. так как возвращает 0, хотя в этом окне ясное дело есть дочерние объекты. читаю командой get_accChildCount - конечно возможно я напутал с синтаксисом get_accChildCount, и поэтому он мне хоть и пишет S_OK... но само количество child пишет 0. но я полагаю что между AccessibleObjectFromWindow и get_accChildCount должна быть еще какая-то команда... ну не может это окно иметь 0, так как внутри него есть пункты всевозможные.



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 октября 2012 17:11 · Поправил: le-greem
· Личное сообщение · #2

Вот код консоли. Самое удивительное, что тот же самый код, исполненный в вышеуказанной библиотеке(в обработчике кнопки) работает вполне себе корректно. Какая то ерунда. Уже голову сломал. Вполне очевидно, что ошибка у меня, но найти никак не могу. Увы.


#include "stdafx.h"
#include <conio.h>
#include <OleAcc.h>

#pragma comment(lib, "oleacc.lib")


int _tmain(int argc, _TCHAR* argv[])
{

HWND hwnd = (HWND)0X0002028C; //хэндл окна которое будет разбираться на дочерние элементы
IAccessible *pIAcc = NULL;

HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible, (void**)&pIAcc); //получаем указатель на интерфейс окна с указанным хэндлом

VARIANT varRole; //роль(тип) объекта
VariantInit(&varRole);

VARIANT varChild;
VariantInit(&varChild);
IAccessible *pIAccChild = NULL;

varChild.vt = VT_I4;
varChild.lVal = CHILDID_SELF;
LONG iChildCount;

long returnCount;

hr = pIAcc->get_accChildCount(&iChildCount);
VARIANT* pArray = new VARIANT[iChildCount];
hr = AccessibleChildren(pIAcc, 0L, iChildCount, pArray, &returnCount);


hr = pIAcc->get_accRole(varChild, &varRole);

wprintf(L"\n Role = %d", varRole.lVal);
wprintf(L"\n Childcount = %d", iChildCount);

getch();


return 0;
}



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 17 октября 2012 18:01
· Личное сообщение · #3

le-greem
Скорее всего неправильный хендл окна указываете, у меня все работает.
Code:
  1. HWND hwnd = (HWND)0X0002028C;
  2. замените на:
  3.     HWND hwnd = FindWindow("CabinetWClass", NULL);
  4.     if (hwnd == NULL)
  5.     {
  6.         LPVOID lpMsgBuf;
  7.         FormatMessage(
  8.             FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  9.             NULL,
  10.             GetLastError(),
  11.             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  12.             (LPTSTR) &lpMsgBuf,
  13.             0,
  14.             NULL
  15.         );
  16.         setlocale(LC_CTYPE, "");
  17.         printf("%s\n", (LPSTR)lpMsgBuf);
  18.         return 0;
  19.     }




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 октября 2012 09:59
· Личное сообщение · #4

Нет. Хэндл окна (точнее контрола из этого окна) верный. Проверял spy++ каждый раз при попытке запустить свой код. В это сложно поверить, но код не работает. Вместо свойств контрола выдает свойства окна и непонятно с чего вдруг. Пару раз видел на англоязычных форумах(к сожалению, искать долго, поэтому источника не приведу) вопросы по данному явлению но все они остались без ответа. Можно было бы просто смириться если бы не безукоризненная работа библиотеки.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 18 октября 2012 12:06
· Личное сообщение · #5

le-greem
Ваш код работает ровно настолько насколько вы его написали.
Смотрите в атаче пример, немного дописал код.

06c3_18.10.2012_EXELAB.rU.tgz - WSpy.rar



Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 февраля 2015 14:07
· Личное сообщение · #6

F_a_u_s_t, не посодействуешь еще раз? в том оригинальном коде ты сделал ехе файл с поиском класса окна - "мой компьютер", можно ли там сделать поиск по классу "Chrome_WidgetWin_1"?

мы тогда портировали код портировали... да не выпортировали эксплорерный список читает, а вот недавно я решил потестировать на окне хрома, и что-то нифига - не читает зараза такая. вот не ясно - или у нас в коде косяк, что скорей всего... или может быть класс окна в хроме другой? твой код изначально правильный, вот на нем бы проверить.




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 08 февраля 2015 20:05 · Поправил: F_a_u_s_t
· Личное сообщение · #7

SeregaZ пишет: можно ли там сделать поиск по классу "Chrome_WidgetWin_1"?

Какие именно косяки у вас?
Без кода хз, какие у вас проблемы.
Code:
  1. h_window := FindWindow( 'Chrome_WidgetWin_1', nil );
  2. h_window := FindWindowEx(h_window, 0, 'Chrome_RenderWidgetHostHWND',nil);


или так, скопировано с просторов интернета, но на вид рабочее:
Code:
  1. procedure WinEventProc(hWinEventHook: HWINEVENTHOOK; event: DWORD; hwnd: HWND;
  2.   idObject, idChild: Longint; idEventThread, dwmsEventTime: DWORD); stdcall;
  3. var
  4.   vAccObj: IAccessible;
  5.   varChild: OleVariant;
  6.   vWSName, vWSValue: WideString;
  7.   ClassName: String;
  8.   Acesso: HResult;
  9. begin
  10.   SetLength(ClassName, 255);
  11.   SetLength(ClassName, GetClassName(hwnd, PChar(ClassName), 255));
  12.  
  13.   if (ClassName = 'Chrome_WidgetWin_1') then
  14.   begin
  15.     Acesso := AccessibleObjectFromEvent(hwnd, idObject, idChild, vAccObj, varChild);
  16.     If (Acesso = S_OK) and (vAccObj <> nil) then
  17.     begin
  18.       vAccObj.Get_accName( { CHILDID_SELF } varChild, vWSName);
  19.       if (vWSName = 'Address and search bar') then
  20.       begin
  21.         vAccObj.Get_accValue( { CHILDID_SELF } varChild, vWSValue);
  22.         if (vWSValue <> '') and (vWSValue <> '<null>') and (UrlVelha <> vWSValue) then
  23.         begin
  24.           UrlVelha := vWSValue;
  25.           TThread.Synchronize(nil, Form1.AddUrlToMemo);
  26.         end;
  27.       end;
  28.     end;
  29.   end;
  30. end;




Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 09 февраля 2015 07:11
· Личное сообщение · #8

не не нужен без дочернего, только первый - Chrome_WidgetWin_1 - в нем находит хотя-бы этот селектор сертификатов, но не читает содержимое поле выбора. а если находить окно, потом дочернее - но даже этот селектор не показывает.

я про тот ехе файл спрашивал в сообщении https://exelab.ru/f/action=vthread&forum=6&topic=20266&page=0#20 там поиск по моему компьютеру. нельзя ли сделать точно-такой-же, но с перламутро... эээ... с поиском окна Chrome_WidgetWin_1, вместо моего компьютера. а я бы его запустил и посмотрел читает ли он это хромное окно с сертификатами или не читает. если читает - значит ошибка у меня. если не читает - значит хром использует что-то хитрое.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 13 февраля 2015 03:16
· Личное сообщение · #9

SeregaZ пишет:
но не читает содержимое поле выбора. а если находить окно, потом дочернее - но даже этот селектор не показывает.


Дык, код же не полностью, не все реализовано, смотрите в MSDN по использованным функциям, там есть примеры на сишке.
А так, я бы на вашем месте перестал насиловать труп и писать на живом языке, ну или хотя бы vb net'e на кодеплексе есть код полного разбора окна, AccExplorer или AccChecker как то так называется.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 13 февраля 2015 07:14
· Личное сообщение · #10

F_a_u_s_t
F_a_u_s_t пишет:
насиловать труп


Это в адрес основателя си?

Хорошо... давно его насилую, ни одной неработающей программы не было!

Поиски окна по классам - вообще алгоритмическая задачка для вузовцев... хотя сейчас уже скорее для школьников... ИМХО за Си будущее всё-таки

-----
IZ.RU




Ранг: 95.1 (постоянный), 247thx
Активность: 0.260.01
Статус: Участник

Создано: 13 февраля 2015 08:23 · Поправил: unknownproject
· Личное сообщение · #11

DenCoder пишет:
Хорошо... давно его насилую, ни одной неработающей программы не было!

А я на паскале прогаю и тоже, как ни странно, ни одной неработающей и глючной проги не было.Удивительно просто! Криворукость программиста от ЯП не зависит, а си давно разложился в виде отрыжек аля жаба,жабаскрипт, экшнскрипт и прочий андроид.Единственное, что нормально кодилось на си во все времена - это игры для первой PlayStation и они кодились на чистом си, а не на отрыжках.

-----
TEST YOUR MIGHT




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 13 февраля 2015 09:11
· Личное сообщение · #12

DenCoder пишет: Это в адрес основателя си?

Это в адрес purebasic, именно на него переводит SeregaZ.
Так то да, осилил си с делфи и еще чем то там.
А задача да, тривиальная есть куча примеров, но все они или на c\c++\c# или delphi, purebasic'u места под солнцем не нашлось, даже под autoit есть библиотека, хз зачем насиловать полумертвый диалект basic'a.



Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 13 февраля 2015 16:07 · Поправил: SeregaZ
· Личное сообщение · #13

да так то понятно что труп... но что я его насилую виноват сей портал! )) когда еще ничего не знал, нужна была простенькая програмка для управления всякими чекбоксами да ниспадающими меню в другой программе - SOM (Sign of Misery) вполне справлялся, я там писал скрипты и он мне делал ехе файлы для управления той другой программой и все было замечательно. но в конце концов уперся там в одну проблему, которую SOM не мог решить технически. зато попалась статья про win api, которое подобное решали. но, насколько я тогда понял, win api это не нечто самостоятельное, то есть там как-бы не было своего компилятора чтоли... то есть нужен был язык программирования, на котором эти винапи можно было бы использовать. и тут значит попался список файлов для загрузки здесь на крэклабе и там для графы PureBasic была пометка о дружбе с win api. а уж Basic в слове PureBasic (школьные корветы и zx спектрум) - и сделало выбор окончательным.


теперь же, годы спустя - основной код той программы уже перевалил за 7 тысяч строк, и я просто не представляю как это все дело переводить теперь на какой-либо другой, более распространенный язык. вот хотелось бы прикрутить теперь хром, точнее управление хромом. (кстати про хром - а сканнеров окон, поддерживающих DirectUIHWND не существует чтоль? погуглил выдает сотни форумов, где люди бродят в дебрях еще дебрее, чем я когда-то бродил думал давно уже есть какой-нить супер мупер сканнер, где можно было-бы уточнить с этим хромом классы окон)


а еще хотелось бы разобраться с cURL. посему, еще не зная что мне искать, попробую на пальцах объяснить что надо найти, и надеюсь что кто-нибудь подскажет точнее куда идти и что делать:

1. нашел какой-то вроде как официальный сайт этого cURL'а, там эти библиотеки. как сказали нужны сразу три: libcurl.dll, libeay32.dll и ssleay32.dll - поскольку в моем проекте другие используемые библиотеки вшиты в тело программы - обязательно ли обойтись именно тремя этими библиотеками? хотелось бы одну... и чтоб тоже вшить в тело программы и читать уже оттуда. когда три непонятных файла лежат рядом с ехешником - не очень солидно. моя позиция: все свое ношу с собой

2. на том сайте, куда я целюсь, происходит авторизация путем выбора сертификата в селекторе сертификатов. читать сертификаты в хранилище виндовса я вроде-бы научился. теперь бы найти пример кода, где используется этот cURL и эта сертификатная авторизация - такое вообще возможно сделать в этом cURL'е?
пока все что я находил это авторизация с помощью логина и пароля. что несколько не то. сами примеры подошли бы на делфи или С++. эти я хоть маленько представляю. но гугл мне дает только php варианты. там я что-то даже представить не могу коим образом происходит импорт этих длл.
*(чуть позже нашел два каких-то примера, судя из названия связанных с сертификатами --> Link <-- и --> Link <-- - по моему первый мой случай? только тут сертификат вшит, а мне надо из хранилища винды его читать?)

3. скачать главную страницу и получить размер кода этой страницы.



Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 18 февраля 2015 09:25
· Личное сообщение · #14

и все-таки мой код видимо правильный. из сообщений данного топика, в аттачах слил ехешник, который мог читать данные из точки и эта программа тоже не читает список с сертификатами:



значит все-таки у хрома гранаты не той системы. или DirectUIHWND обновлялся и там появились новые элементы, которых раньше не было и поэтому они не могут быть прочитаны путем использования старого кода?



Ранг: 29.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 01 марта 2015 19:20
· Личное сообщение · #15

не читает она и все тут... всякие AccCheckUI скачивал, AutomationSpy - не читают.


но в последнем там какое-то окошко HeplText, говорящее о ScrollView - как читать этот ScrollView?


<< . 1 . 2 .
 eXeL@B —› Программирование —› подскажите порядок команд по разбору содержимого окна класса DirectUIHWND
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати