Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.034 c
7-1078500222
Александр1
2004-03-05 18:23
2004.05.02
Flash Hard Driver


4-1079030059
BaDeVlad
2004-03-11 21:34
2004.05.02
Как сделать многоуровневую отмену в Richedit?


14-1081798589
Мишка Кулясов
2004-04-12 23:36
2004.05.02
Лишают ника


6-1078345016
NightBlaze
2004-03-03 23:16
2004.05.02
net send


14-1081519373
hgd
2004-04-09 18:02
2004.05.02
Что такое Application.Messagebox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский