Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Вопрос по сообщениям


Автор: Dmitry_177 29.9.2006, 15:32
При использовании VCL сообщения можно так ловить:

Код

procedure WmCopyData(var Message: TMessage); message WM_COPYDATA;
...

procedure TCharLogReceiver.WmCopyData(var Message: TMessage);
begin
...

Message.Result := 1;
end;


Вопрос в том, зачем иногда в конце обработки делают такое присваивание Message.Result := 1;? В данном случае с WM_COPYDATA...

А еще как такое присваивание сделать(если нужно) если обрабатвать без использования VCL, на чистом API?

Код

function WindowProc(Window: HWnd; Message, WParam: Word; LParam: LongInt): LongInt; stdcall;
begin
case Message of
 WM_COPYDATA: begin
 ....
 как здесь сделать такое присваивание?
 end;
end;

Автор: Romikgy 29.9.2006, 15:46
Код

function WindowProc(Window: HWnd; Message, WParam: Word; LParam: LongInt): LongInt; stdcall;
begin
case Message of
 WM_COPYDATA: begin
 
Result := 1;
 end;
end;


Добавлено @ 15:47 
А зачем , имхо для того чтобы сказать системе или др. приложению , что ты обработал мессагу успешно

Автор: Dmitry_177 29.9.2006, 16:30
Т.е. всегда надо делать такое присваивание во всех сообщениях? или только в каких-то определенных?

Автор: Romikgy 29.9.2006, 16:35
имхо желательно во всех, но 1 или 0 в зависимость от удачности или неудачности выполненого кода

Автор: Dmitry_177 29.9.2006, 16:41
т.е. 1-это удачно, а 0 - неудачно?

Автор: Yanis 29.9.2006, 17:09
Dmitry_177
По каждому сообщению в справке имеется раздел Return Values.

Цитата
WM_COPYDATA

Return Values
If the receiving application processes this message, it should return TRUE; otherwise, it should return FALSE. 

В данном случае 1 (True), а 0 (False).

Добавлено @ 17:10 
Цитата
WM_GETTEXT
 
Return Values
The return value is the number of characters copied.

А при обработке этого сообщения Result должен быть равным кол-ву скопированых в буфер символов.

Автор: Romikgy 29.9.2006, 21:37
Цитата(Dmitry_177 @  29.9.2006,  15:41 Найти цитируемый пост)
т.е. 1-это удачно, а 0 - неудачно? 

имхо в вин апи почти везде 
0 - неудача
не равно 0 - удача,
хотя может быть на оборот имхо мсдн рулит smile

Автор: Dmitry_177 1.10.2006, 16:03
Подскажите тогда еще мне вот что: 
Result := DefWindowProc (Window, Message, WParam, LParam);  --> Зачем мы делаем это присваивание, в конце, если Result равен 0 (изначально) или 1?
Код

function WindowProc(Window: HWnd; Message, WParam: Word; LParam: LongInt): LongInt; stdcall;
begin
Result := 0;
  case Message of
    WM_COPYDATA: begin
    ....
    Result := 1;
  end;

Result := DefWindowProc (Window, Message, WParam, LParam);
end;

Автор: Dmitry_177 1.10.2006, 16:50
Может так надо делать?
Код

function WindowProc(Window: HWnd; Message, WParam: Word; LParam: LongInt): LongInt; stdcall;
begin
Result := 0;
case Message of
  WM_COPYDATA: begin
  ....
  Result := 1;
  end
else
  Result := DefWindowProc (Window, Message, WParam, LParam);
end;

Автор: Romikgy 1.10.2006, 16:51
Цитата(Dmitry_177 @  1.10.2006,  15:03 Найти цитируемый пост)
Result := 1;

нужно если в обработчике ты не допускаешь дохода проги к 
Цитата(Dmitry_177 @  1.10.2006,  15:03 Найти цитируемый пост)
Result := DefWindowProc (Window, Message, WParam, LParam);

если ты вызываешь эту строку то присвоение 
Цитата(Dmitry_177 @  1.10.2006,  15:03 Найти цитируемый пост)
 Result := 1;
можно не делать


Автор: Dmitry_177 1.10.2006, 17:07
DefWindowProc я как понимаю вызывает windows-обработчик этого сообщения, а вот в данном случае с WM_COPYDATA, так надо делать, как я показал в последнем примере?

Автор: Romikgy 1.10.2006, 17:13
Цитата(Dmitry_177 @  1.10.2006,  16:07 Найти цитируемый пост)
 вызывает windows-обработчик

пропущено слово "стандартный" т.е. ты перехватываешь существующие обработчики сообщений, и если надо передаешь управление старому обработчику, если не надо , то не вызываешь его

Автор: Dmitry_177 1.10.2006, 17:16
т.е. что-то типа inherited?

Автор: Romikgy 1.10.2006, 18:29
да , что то типа

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)