C / C ++ Hook для доступа к элементам окна программы - PullRequest
1 голос
/ 24 марта 2011

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

Например, я хочу щелкнуть по определенному элементу определенного списка автоматически.

Мне интересен только доступ к одному списку из одного окна программы, но это помогло бы мне создать очень хороший макрос (список полностью «расширяется», он длинный и динамический).

Я думал об использовании макросов, таких как Autohotkey, но быстро счел это плохой идеей.

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

PS: Я работаю в 64-битной системе Windows 7, используя кодовые блоки. Дайте мне знать, если для этого есть лучшая IDE, например VS, потому что я тоже могу ее использовать.

EDIT

Хорошо, я поймал информацию об окне с помощью WinSpy ++, хотя на самом деле я не знаю, что с ним делать. Я пытаюсь получить дескриптор дочернего окна, но не могу.
Я очень нуб в этом. Я напомнил о важной детали, мне нужно получить имена элементов списка и их позиции (1-й, 2-й, 3-й), возможно ли это?

РЕДАКТИРОВАТЬ 2 (Где я)
Хорошо, вот где я до сих пор: я поймал дескриптор главного окна, но не могу получить дескриптор ни одного из детей. Мой поиск в Google включил функцию GetDlgItem, но не сработал. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Вы можете использовать Spy ++, чтобы найти определенный класс и / или заголовок для окна (элемент управления списка), а затем настроить его с помощью FindWindow ().

Если нет, вам придетсянайдите главное окно приложения и просмотрите его дочерние элементы, ищите дочерние элементы дочерних элементов, пока не найдете окно списка.

Как только вы, наконец, получите дескриптор окна, вы можете просто PostMessage () отправить ему сообщение WM_CLICK..

РЕДАКТИРОВАТЬ 1 (для Meysam)

Я начал с поиска в Google для Сообщения окна просмотра списка .Это привело меня к этой странице MSDN .Если посмотреть вниз по списку, LVM_GETITEM выделяется.Он принимает структуру LVITEM в качестве LPARAM.

В этой структуре член iItem идентифицирует индекс.Все, что вам нужно знать сейчас, это количество элементов, чтобы вы могли перебирать каждый индекс и писать код, подобный этому псевдокоду:

for (int i = 0; i < item_count; i++)
{
    LVITEM lvi;
    lvi.iItem = i; // probably need to set other pieces of the struct
    LRESULT item = SendMessage(hwnd, LVM_GETITEM, NULL, (LPARAM)lvi);
}

Для количества элементов (item_count) используйте LVM_GETITEMCOUNT.

 LRESULT item_count = SendMessage(hwnd, LVM_GETITEMCOUNT, NULL, NULL);
1 голос
/ 24 марта 2011

Крюк - это то, что вы хотите.

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

Во-вторых, вы должны зарегистрировать свою ловушку с некоторыми событиями, такими как события перемещения / щелчка мыши, используя API SetWindowsHookEx ().

Тогда вы можете полностью получить доступ к списку.

Совет: вы можете использовать небольшой инструмент под названием MS Spy ++ , чтобы получить идентификатор или имя списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...