Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Заменить функцию окна у десктопа   Найти похожие ветки 

 
Labert   (2004-02-29 14:42) [0]

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

Задача: Нужно перехватывать сообщение 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, т.е. она фактически не делает то, что требуется.

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

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


 
DVM ©   (2004-02-29 15:07) [1]


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

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


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

Спасибо.

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

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


 
jack128 ©   (2004-02-29 17:06) [3]

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


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

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


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

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-03-02 00:29) [6]

Я бы даже сказал, что сообщения мыши приходят окну 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++ - классная программа


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



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
1-1082097647
Litva
2004-04-16 10:40
2004.05.02
Что луче?...


14-1081849758
RealRascal
2004-04-13 13:49
2004.05.02
Как хранить большие логичесике матрицы?


1-1082145941
tivispider
2004-04-17 00:05
2004.05.02
Как можно узнать кодировку файла (txt)?


9-1068621377
Леприкон
2003-11-12 10:16
2004.05.02
Поверхность вращения


4-1078825864
X9
2004-03-09 12:51
2004.05.02
Переключение задач.