Код:

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.