Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Старожил


Сообщения: 352
Благодарности: 193

Профиль | Отправить PM | Цитировать


murlocks,
Для WM_GETTEXT и других сообщений, которые возвращают значения в wParam/lParam, встроенная инструкция SendMessage не подходит.
Но можно воспользоваться плагином System.
Пример, читающий текст с кнопки Next/Install/Close

Код: Выделить весь код
GetDlgItem $0 $HWNDPARENT 1
System::Call 'USER32::SendMessage(i $0, i ${WM_GETTEXT}, i ${NSIS_MAX_STRLEN}, t .r1)  i .r2'
MessageBox MB_OK 'text: $1$\nchars: $2'
Что здесь происходит (упрощённо):

Функция SendMessage принимает 4 параметра:
HWND - дескриптор окна, которому отсылается сообщение
Msg - код сообщения
wParam - значение, специфичное для конкретного сообщения
lParam - значение, специфичное для конкретного сообщения

Параметры для сообщения WM_GETTEXT:
wParam - максимальное число символов, которые надо прочитать, включая концевой нулевой (null, \0) символ (для чтения максимум 5 символов необходимо задать значение 6).
В примере выше ${NSIS_MAX_STRLEN} задаёт максимально возможное значение в используемой сборке NSIS (по умолчанию - 1024 символа)
lParam - указатель на буфер, содержащий прочитанный текст.
В примере выше это "t .r1", что (упрощённо) говорит "текстовое значение поместить в переменную (регистр) $1".

Функция SendMessage с сообщением WM_GETTEXT возвращает число прочитанных символов, не включая концевой символ. Это фрагмент " i .r2" в примере выше и его можно удалить, если использование этого числа не планируется.

Результат, помимо переменных $0..$9, $R0..$R9, можно поместить и в стек, $INSTDIR, $OUTDIR и некоторые другие переменные. Подробности есть в справке по плагину System.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:48, 26-12-2020 | #2498