Помощь - Поиск - Пользователи - Календарь
Полная версия: Winapi опять воду мутит
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
TarasBer
Суть такова. Я написал свой аналог EDIT.
Все строки он хранит внутри себя в специальной структуре (заголовок я вообще не трогал), поэтому некоторые сообщения я подменил:


WM_GETTEXTLENGTH: begin
Result := TextLength(H); // H:HWND - первый параметр
Exit;
end;
WM_GETTEXT: begin
CopyText(H, W, PChar(L)); // W:WPARAM; L:LPARAM - 3 и 4 параметры
Exit;
end;


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

Почему-то функция, что берёт текст из него, возвращает мусор.
Сначала я увидел, что L, который пришёл в функцию, нихрена не сопадает с указателем на буфер. И хотя в PChar(L) приходят верные символы, сама строка заполняется каким-то мусором. Потом я увидел, что если W=0, то в оконный буфер вообще ничего не приходит.
В общем у меня вопрос - что за хрень происходит с сообщением после SendMessage? По-моему, оно должно просто сразу вызвать оконную функцию, вместо этого происходит что-то непонятное.
Как вообще надо правильно отвечать на WM_GETTEXT?
TarasBer
ОЛОЛО, я возвращал ноль, а надо было возвращать количество скопированных символов.
Программа заработала, но вопрос, почему в оконную функцию в LPARAM приходит указатель на место в стеке, остался.
TarasBer
Не, проблема не решена.
Я решил EM_GETLINE обработать.
Посмотреть, какого хрена в строке мусор оказывается.
Так вот, винда вообще не доносит сообщение до окна!!! То есть я посылаю SendMessage, но в оконную функцию ничего не приходит.
Что делать и какого хрена?
IUnknown
А можно посмотреть, как именно посылается EM_GETLINE? То есть, меня интересует, что делается с параметрами WPARAM/LPARAM перед посылкой сообщения. MSDN указывает конкретно, что надо сделать (MSDN -> EM_GETLINE message) :
Цитата
Before sending the message, set the first word of this buffer to the size, in TCHARs, of the buffer. For ANSI text, this is the number of bytes; for Unicode text, this is the number of characters. The size in the first word is overwritten by the copied line.
, это делается?
TarasBer
> set the first word of this buffer to the size, in TCHARs, of the buffer

Нет, этого я не делал.
Так блин, сообщение обрабатывает МОЁ окно, и здесь Я РЕШАЮ, как обработать сообщение, почему винда позволяет себе корёжить сообщение перед тем, как его донести до окна? Почему нельзя сразу сделать
H->WndProc(H,M,W,L)?

Короче, я вообще свои собственные константы на основе WM_USER сделал, с ними таких приколов нету.
IUnknown
Цитата
и здесь Я РЕШАЮ, как обработать сообщение
Перед тем, как ТВОЕ окно обработает сообщение, ты нарушаешь контракт функции, чего ты от нее ждешь потом? Правильного функционирования? Обрабатывай, как хочешь, но перед этим необходимо, чтобы сообщение ДОШЛО до твоего окна. Пока контракт не выполнен - это может не произойти. Внимание, вопрос: "Кто виноват?" Ты, не соблюдая условия, которые тебе выставляет библиотека, или библиотека, "которая слишком тупая, и не понимает, что я хочу по-своему обработать стандартное сообщение"? Ну, обрабатывай... Если получишь...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.