![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Суть вопроса: хотелось бы рисовать на канве заголовков (Caption) всех окон (своих и чужих) винды (хотябы родительских окон) некую графику - картинку.
Как хочу реализовать: в длл реализовать функцию отлова сообщения WM_PAINT и поставить SetWindowsHookEx() хук на это сообщение. Есс-но реализовать функцию рисования картинки по этому сообщению, после пропускания его через стандартную процедуру - тоесть сначала позволить отрисоваться компонентам, а по верх уже рисовать картинку. основные вопросы с этим связанные: 1. Как ловить WM_PAINT, направить в стандартную процедуру обработки сообщения, после чего рисовать картинку. 2. Как пропускать все остальные сообщения? - пожалуй самое важное ![]() 3. Как получать либо дескриптор окна вызовавшего WM_PAINT либо HDC на канву заголовка, вызвавшего WM_PAINT? 4. Как со всем с этим связан WH_CALLWNDPROCRET (или WH_JOURNALRECORDPROC)? Спасибо ![]() |
|
#2
|
||||
|
||||
|
Код:
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. |
|
#3
|
||||
|
||||
|
Как ни прискорбно, наверное надо либо другой хук ставить (не WH_GETMESSAGE) либо еще разные WM_-ы обрабатывать, потому что рисовать рисует, но иногда не на всех (типа Проводник - фиг), и рисует исключительно при активации и то не всегда.
+ как нарисовать например слева от ВИДИМЫХ системных кнопок в заголовке, тоесть найти правое выравнивание, при этом есть окна где все три кнопки - тогда понятно, а вот есть дочерние, у которых только одна - тогда неясно. Или например как определить сколько кнопок? вот такие вопросы. |