Страницы

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

Показаны сообщения с ярлыком sendmessage. Показать все сообщения
Показаны сообщения с ярлыком sendmessage. Показать все сообщения

пятница, 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. Я не совсем понимаю, почему для взаимодействия с каким-либо элементом в одних случая сообщения направляются непосредственному элементу, а в других - окну, с указанием целевого элемента, то есть - косвенно. Скорее всего, сообщение отправляется тому элементу, который его обрабатывает.

среда, 12 июня 2019 г.

Отправить сообщение в табличном виде в мессенджер (Viber, Messenger, WhatsApp и др.)

Есть БД и приложение заливающее в эту БД строки информации с названием, датой и суммой. Хочу пересылать информацию полученную с SQLite в сторонний мессенджер конкретному пользователю. Например в Viber текстовым сообщением в формате:
Название / дата / цена ---------------------- Сахар / 17.05 / 1$ Молоко / 18.05 / 2$ Молоко / 18.06 / 2$ ---------------------- Кол-во продуктов: 3 Сумма: 4$
Вытащить информацию с БД и залить в текстовый документ или в CSV - могу. А вот потом передать все это в виде таблицы - не могу сообразить как.
Пока что могу отправлять только текстовое сообщение в одну строку. Примеры которые находил в основном как залить картинку, текст или файл. Направьте в нужное русло,


Ответ

Наверное вам надо просто бежать циклом по колонкам таблицы и значения в строку фигачить. И каждую строку от другой переносом строки отгораживать.
Также, надо какой-то код написать который будет находить самую длинную строку в каждой колонке и получить, в итоге, максимальное кол-во символов в каждой строке. Вот и получится выровнено после добавления пробелов для коротких значений.
Вряд ли какая-то либа существует, которая решит эту задачу - слишком узкая она. Таблицы вообще боль на мобилках. Они только в WebView нормально (условно нормально) работают. Думаю помимо составления текста с переносами и пробелами вручную способов нет. И даже в этом случае будет проблема не помещения строки таблиц в размер экрана (из-за маленького экрана или большого размера шрифта в настройках девайса). Будут автопереносы и будет некрасиво и нечитаемо. Может стоит рассмотреть генерирование HTML таблицы на к-л сайте и кидание ссылки на эту страницу. Т.е. идеального варианта всё одно сделать никак нельзя. Придётся идти на компромиссы с костылями.