Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Заменить функцию окна у десктопа [D5]


Labert ©   (2004-02-29 14:42:00) 

Уважаемые мастера! Есть вопрос.

Задача: Нужно перехватывать сообщение WM_LBUTTONDOWN, поступающее
в окно десктопа.
Конечно, можно это делать с помощью ловушек, но я хочу использовать другой способ:

Устанавливаю для десктопа свою функцию окна:

type
TWndMethod = procedure(var Message: TMessage) of object;
//это стандартный тип, а не мой собственный

var
POriginalWndProc : pointer;
OriginalWndProc : TWndMethod;
desktop : HWND;

procedure FakeWndProc(var Message: TMessage);

procedure TForm1.Button1Click(Sender: TObject);
begin
 //тут код, выясняющий HWND верхнего окна десктопа. HWND
 //сохраняется в переменной desktop
POriginalWndProc := pointer(GetWindowLong(desktop,GWL_WNDPROC));
@OriginalWndProc := POriginalWndProc;

SetWindowLong(desktop,GWL_WNDPROC,Integer(@FakeWndProc))
end;

procedure FakeWndProc(var Message: TMessage);
begin
 if Message.Msg = WM_LBUTTONDOWN then ShowMessage('Message handled');
OriginalWndProc(Message)
end;

пробовал вместо вызова OriginalWndProc(Message) писать
CallWindowProc(POriginalWndProc, progman, Message.Msg, Message.WParam, Message.LParam);
тот же результат

Проблема в вызове SetWindowLong - она возвращает 0, т.е. она фактически не делает то, что требуется.

Как решить эту проблему?

Заранее спасибо


Игорь Шевченко   (2004-03-02 00:29:00) [1]

Я бы даже сказал, что сообщения мыши приходят окну SysListView_32, являющемуся дочерним контролом с идентификатором 1 окна класса SHELLDLL_DefView...

А зачем делать свою структуру, если она в windows.pas определена:


 tagMOUSEHOOKSTRUCT = packed record
   pt: TPoint;
   hwnd: HWND;
   wHitTestCode: UINT;
   dwExtraInfo: DWORD;
 end;
 TMouseHookStruct = tagMOUSEHOOKSTRUCT;
 PMouseHookStruct = ^TMouseHookStruct;
 MOUSEHOOKSTRUCT = tagMOUSEHOOKSTRUCT;


Может быть, ключевое слово packed поможет ?

> MS Spy++ - классная программа


Да, хорошая программа.


Labert   (2004-03-01 22:19:00) [2]

TO: Игорь Шевченко
begin
ОК, я допустил неточность - сообщения приходят не
окну "Desktop",а окну "Program manager" (класс Progman)и
его детям.
end

Кстати, я для отслеживания сообщений и окон и пользуюсь
MS Spy++ - классная программа. А кто какими инструментами
еще пользуется, если не секрет?

Если позволите, еще один вопрос:
Я сделал глобальную ловушку (HOOK) в Dll-ке. Все работает,
но есть проблемка. Ловушка типа WH_MOUSE.
В функцию ловушки через параметр lParam передается указатель
на структуру

typedef struct {
   POINT  pt;
   HWND  hwnd;
   UINT  wHitTestCode;
   ULONG_PTR  dwExtraInfo;
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;

так вот, мне интересно выяснить координаты мыши. Я в своей
программе делаю соответствующий типы для этой структуры:

TMOUSEHOOKSTRUCT = record
 pt : TPoint;
 hwnd_ : HWND;
 wHitTestCode : UINT;
 dwExtraInfo : PULONG
end;

PMOUSEHOOKSTRUCT = ^TMOUSEHOOKSTRUCT;

но координаты как-то криво передаются, неправильно. У меня
сильное подозрение, что мой тип неправильно накладывается
на Windows-овскую структуру.

Как тут быть, подскажите, кто знает

заранее спасибо


Игорь Шевченко   (2004-02-29 19:37:00) [3]

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


jack128   (2004-02-29 17:06:00) [4]

только написать stdcall; после функции..


Labert   (2004-02-29 15:18:00) [5]

Спасибо.

А вот еще такой вопрос.
В C++, например, при написании CALLBACK функций (оконных или ловушек) приходилось указывать кучу всяких модификаторов типа
WINAPI, LRESULT, CALLBACK

Нужно ли в Delphi тоже как-то специально оформлять такие функции, в частности ловушки?


DVM   (2004-02-29 15:07:00) [6]


> Проблема в вызове SetWindowLong - она возвращает 0, т.е.
> она фактически не делает то, что требуется.
>
> Как решить эту проблему?

Сам же написал, что можно использовать ловушки. НЕ МОЖНО А НУЖНО! Дело в том, что твоя оконная функция в одном адресном пространстве, а окно, которому она назначается в другом. Потому и ничего не происходит.


Наверх

Титульная страница Поиск, карта сайта Написать письмо