Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

WinAPI, SendMessage()

#c #winapi #sendmessage



Правильно ли я понимаю, что SendMessage() - это более низкоуровневый способ взаимодействия
с окнами, чем специализированные функции, например - SetWindowText(), CheckDlgButton()
и пр.?

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

Например, функция CheckDlgButton() отправляет команду изменения состояния элемента-метки
не самому элементу-метке, а окну, которое содержит элемент-метку.

    


Ответы

Ответ 1



В каждом конкретном случае ответ может быть разным. Читайте документацию. Насколько я помню, есть ситуации, когда внешне эквивалентные операции (через функцию и через сообщение) на самом деле имеют отличия, в частности в случаях когда целевое окно принадлежит другому процессу. Сообщения во всех случаях направляются именно напрямую целевому дочернему окну. Но для того, чтобы направить сообщение окну, надо знать его хэндл. Функции типа CheckDlgButton в качестве идентификатора целевого дочернего элемента принимают его ID, а не его хэндл окна. Работать с дочерними элементами, разумеется, удобнее по ID, ибо именно ID и идентифицирует конкретный элемент в ресурсе. Эти функции сами внутри определят хэндл дочернего окна по его ID - через GetDlgItem, а затем уже пошлют ему сообщение. Хэндл окна-владельца передается в такие функции именно для вызова GetDlgItem. Эти функции существую лишь для вашего удобства - чтобы вам вручную не надо было переводить ID в хэндл дочернего окна. Вас никто не заставляет пользоваться этими "удобными" функциями. Если вам так больше нравится, вы можете общаться с дочерним окном напрямую: либо самостоятельно сконвертировав его ID в хэндл через GetDlgItem, либо получив этот хэндл каким-то другим способом.

Ответ 2



Правильно ли я понимаю, что SendMessage() - это более низкоуровневый способ взаимодействия с окнами, чем специализированные функции, например - SetWindowText(), CheckDlgButton() и пр.? Неправильно. Это разные функции и работают они по-разному. У меня были случаи, когда получения текста окна работало либо только через SendMessage, либо только через GetWindowText. Я не совсем понимаю, почему для взаимодействия с каким-либо элементом в одних случая сообщения направляются непосредственному элементу, а в других - окну, с указанием целевого элемента, то есть - косвенно. Скорее всего, сообщение отправляется тому элементу, который его обрабатывает.

Комментариев нет:

Отправить комментарий