Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.07.2008, 12:54
Аватар для notricky
notricky notricky вне форума
Прохожий
 
Регистрация: 09.07.2008
Сообщения: 13
Репутация: 10
По умолчанию WM_PAINT, HOOK, WH_CALLWNDPROCRET

Суть вопроса: хотелось бы рисовать на канве заголовков (Caption) всех окон (своих и чужих) винды (хотябы родительских окон) некую графику - картинку.

Как хочу реализовать: в длл реализовать функцию отлова сообщения WM_PAINT и поставить SetWindowsHookEx() хук на это сообщение. Есс-но реализовать функцию рисования картинки по этому сообщению, после пропускания его через стандартную процедуру - тоесть сначала позволить отрисоваться компонентам, а по верх уже рисовать картинку.

основные вопросы с этим связанные:
1. Как ловить WM_PAINT, направить в стандартную процедуру обработки сообщения, после чего рисовать картинку.
2. Как пропускать все остальные сообщения? - пожалуй самое важное
3. Как получать либо дескриптор окна вызовавшего WM_PAINT либо HDC на канву заголовка, вызвавшего WM_PAINT?
4. Как со всем с этим связан WH_CALLWNDPROCRET (или WH_JOURNALRECORDPROC)?


Спасибо
Ответить с цитированием
  #2  
Старый 11.07.2008, 01:11
Аватар для notricky
notricky notricky вне форума
Прохожий
 
Регистрация: 09.07.2008
Сообщения: 13
Репутация: 10
По умолчанию

Код:
library HookDll;
uses
  SysUtils,dialogs, Windows, Messages, Graphics, Classes;
var
  TheHook: HHook = 0;

function WMPaintHook(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall;
var
  C: TCanvas;
  wnd: HWND;
  t: array[0..255] of char;
  s: string;
begin
  if (Code < 0) then
  begin
    Result := CallNextHookEx(TheHook,Code,WParam,LParam);
    exit;
  end
  else
    if TMsg(Pointer(LParam)^).Message = WM_PAINT then
    begin
      WND := TMsg(Pointer(LParam)^).hwnd;
      if WND <> 0 then
      begin
        ShowMessage('Åñòü êîíòàêò');
        //
      end;
    end;
  Result := CallNextHookEx(theHook, Code, wParam, lParam);
end;

Procedure SetHook(SetupHook: boolean); stdcall;
begin
  if SetupHook then
    TheHook := SetWindowsHookEx(WH_CALLWNDPROCRET,@WMPaintHook,HInstance,0)
  else
    UnhookWindowsHookEx(TheHook);
end;

exports
  SetHook index 1 name 'SetHook';

{$R *.res}

begin

end.
Такой вот получился код. Только как теперь по полученному WND найти дескриптор главного окна, чтобы потом найти заголовок (Caption)?
Ответить с цитированием
  #3  
Старый 15.07.2008, 16:52
Аватар для notricky
notricky notricky вне форума
Прохожий
 
Регистрация: 09.07.2008
Сообщения: 13
Репутация: 10
По умолчанию ...

Как ни прискорбно, наверное надо либо другой хук ставить (не WH_GETMESSAGE) либо еще разные WM_-ы обрабатывать, потому что рисовать рисует, но иногда не на всех (типа Проводник - фиг), и рисует исключительно при активации и то не всегда.

+ как нарисовать например слева от ВИДИМЫХ системных кнопок в заголовке, тоесть найти правое выравнивание, при этом есть окна где все три кнопки - тогда понятно, а вот есть дочерние, у которых только одна - тогда неясно. Или например как определить сколько кнопок?

вот такие вопросы.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:42.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter