IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Winapi опять воду мутит
TarasBer
сообщение 25.01.2012 15:35
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Суть такова. Я написал свой аналог 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?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 26.01.2012 10:05
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


ОЛОЛО, я возвращал ноль, а надо было возвращать количество скопированных символов.
Программа заработала, но вопрос, почему в оконную функцию в LPARAM приходит указатель на место в стеке, остался.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 27.01.2012 12:37
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Не, проблема не решена.
Я решил EM_GETLINE обработать.
Посмотреть, какого хрена в строке мусор оказывается.
Так вот, винда вообще не доносит сообщение до окна!!! То есть я посылаю SendMessage, но в оконную функцию ничего не приходит.
Что делать и какого хрена?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 27.01.2012 12:52
Сообщение #4


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


А можно посмотреть, как именно посылается 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.
, это делается?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 27.01.2012 13:12
Сообщение #5


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> set the first word of this buffer to the size, in TCHARs, of the buffer

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

Короче, я вообще свои собственные константы на основе WM_USER сделал, с ними таких приколов нету.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 27.01.2012 13:21
Сообщение #6


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


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

Сообщение отредактировано: IUnknown - 27.01.2012 13:22
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.04.2024 8:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"