Форум: "WinAPI";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизЗаменить функцию окна у десктопа Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.03 c