Невозможно установить флажок, используя C # WinAPI - PullRequest
0 голосов
/ 23 февраля 2012

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

//Check the checkbox
        IntPtr SubtitlesSection = FindWindowEx(MoreOptions, IntPtr.Zero, null, "Subtitles");
        IntPtr AddSubtitlesCheckbox = FindWindowEx(SubtitlesSection, IntPtr.Zero, null, "Enable/Disable");

        SendMessage(AddSubtitlesCheckbox, BM_SETSTATE, 1, IntPtr.Zero);
        SendMessage(AddSubtitlesCheckbox, BM_SETCHECK, 1, IntPtr.Zero);
        SendMessage(AddSubtitlesCheckbox, WM_PAINT, 0, IntPtr.Zero);
        SendMessage(AddSubtitlesCheckbox, WM_LBUTTONDOWN, 1, MakeLParam(10, 10));
        SendMessage(SubtitlesSection, WM_PARENTNOTIFY, (int)MakeLParam((int)AddSubtitlesCheckbox, WM_LBUTTONDOWN), MakeLParam(26, 31));
        SendMessage(SubtitlesSection, WM_PARENTNOTIFY, (int)MakeLParam((int)AddSubtitlesCheckbox, WM_LBUTTONUP), MakeLParam(26, 31));

Флажок расположен на вкладке «Дополнения» под разделом «Субтитры» и называется «Включить / Отключить».

Я что-то не так делаю?1006 *

Спасибо за любую помощь!

Редактировать: Теперь я вижу, что этот код действительно работает, и он проверяет флажок, но у меня все еще есть проблема, поскольку он не меняет всеэлементы управления, которые должны измениться, когда я проверяю флажок вручную, а не внутри своей программы.Есть ли способ заставить родительский элемент управления перерисовать себя или вызвать событие изменения, когда я отмечаю флажок как отмеченный?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Когда состояние дочернего элемента управления изменяется (в ответ на действие пользователя), он отправляет некоторые уведомления в свое родительское окно, а родительское окно, перехватывая эти сообщения, выполняет действия.Это уведомления WM_COMMAND и WM_NOTIFY.

. Наблюдая за сообщениями, отправляемыми в родительское окно элемента управления вашего флажка (и проверяя элемент управления с помощью мыши), я заметил одно сообщение WM_COMMAND и два WM_NOTIFY сообщений.Эти сообщения были недоступны, когда я программно отправил сообщение BM_SETCHECK на флажок.Итак, волшебство раскрылось.

Отправка WM_NOTIFY немного сложна, потому что вы должны выделить память в адресном пространстве другого процесса (используя VirtualAllocEx, для структуры NMHDR), заполнить память(используя WriteProcessMemory), отправьте сообщение, а затем освободите выделенную память.

Отправка WM_COMMAND сообщения слишком упрощена.Я протестировал его, и оно сработало!

    Win32.SendMessage(SubtitlesSection, Win32.Message.WM_COMMAND, 0, AddSubtitlesCheckbox);

Сообщение отправляется родительскому элементу управления флажка, используя дескриптор элемента управления в качестве четвертого параметра.Третий параметр функции должен быть контрольным идентификатором, и этот идентификатор изменяется каждый раз.Но, надеюсь, похоже, что программа проверяет дескриптор управления, а не идентификатор.

0 голосов
/ 23 февраля 2012

попробуйте использовать spy ++, чтобы убедиться в расположении флажка, если все не работает, и это должно работать на Vista и выше. Я бы использовал Windows Automation

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