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

Вниз

Проблема с ловушками...   Найти похожие ветки 

 
MouseAlexander   (2004-12-06 17:02) [0]

Здравствуйте... И сразу к делу. Есть программа, которая использует ловушку на события
мыши (мышеловку :). При нажатии на среднюю кнопку мыши главное окно формы должно
показываться (если оно не было видимым) или исчезать... Вроде все просто... Но вот
проблемы:
1. При работе программы проводник (explorer.exe) вылетает с "рантайм еррор"... Чего
вдруг?
2. Форма показываеться только один раз. Т.е. запустил программу, нажал ср. кнопку, форма
исчезла, еще раз нажал - показалась, а дальше - нажимаю, и ничего не происходит...

Вот код dll-ки и главного модуля:
library mhook;

uses
 Windows, Messages;

const
 UM_MOUSEHOOK = WM_USER + 101;
 GLOBALMAPID = "{DCC9CEE7-6BC8-41C6-8CF4-7CF050B1FBC5}";

type
 PShareInf = ^TShareInf;
 TShareInf = record
               appWndHandle: HWND;
               oldHookHandle: HHOOK;
               hm: THandle;
             end;

var
 mapHandle: THandle = 0;
 shareInf: PShareInf = nil;

procedure DLLEntryPoint(dwReason: DWORD); stdcall;
begin
 case dwReason of
   DLL_PROCESS_ATTACH:
   begin
     MapHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0,
SizeOf(TShareInf), GLOBALMAPID);
     ShareInf := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareInf));
   end;
   DLL_PROCESS_DETACH:
   begin
     UnMapViewOfFile(ShareInf);
     CloseHandle(MapHandle);
   end;
 end;
end;

function MouseHook(nCode, wParam, lParam: Integer): LResult; stdcall;
var
 lpbuf: lpstr;
begin
 if nCode in [HC_ACTION, HC_NOREMOVE] then
 begin
   if wParam = WM_MBUTTONDOWN then
   begin
     PostMessage(shareInf.appWndHandle, UM_MOUSEHOOK, wParam, lParam);
   end;
 end;
 Result := CallNextHookEx(shareInf.oldHookHandle, nCode, wParam, lParam);
end;

function SetMouseHook(wnd: HWnd): Boolean;
begin
 if shareInf <> nil then
 begin
   shareInf^.AppWndHandle := Wnd;
   shareInf^.OldHookHandle := SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0);
   Result := shareInf^.OldHookHandle <> 0;
 end else
   Result := false
end;

function RemoveMouseHook: Boolean;
begin
 Result := UnhookWindowsHookEx(shareInf^.OldHookHandle);
 CloseHandle(shareInf^.hm);
end;

exports
 SetMouseHook,
 RemoveMouseHook;

begin
 DLLProc := @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


unit u_MAIN;
....
function SetMouseHook(wnd: HWnd): Boolean; external и т.д.
...
procedure TfrmMain.Formcreate(Sender: TObject);
begin
 SetMouseHook(Handle);
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
 RemoveMouseHook;
end;

procedure TfrmMain.UmMouseHook(var msg: TMessage);
begin
 Visible := not Visible;
end;
...

Что тут не так?
Заранее спасибо!
И еще: ответы по сути просьба также слать мне на мыло (поожаалууйстаа)


 
Piter ©   (2004-12-06 17:38) [1]

ну ты и насоздовал тем... давайте истиной считать эту тему...


 
MouseAlexander   (2004-12-06 17:45) [2]

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


 
КЕНТ   (2004-12-06 23:48) [3]

Серьезно нужна помощь, ну неужели это так трудно?


 
Digitman ©   (2004-12-07 09:29) [4]


> CloseHandle(shareInf^.hm);


хэндл чего хранится в поле структуры ТshareInf.hm ?
не вижу нигде коде записи в это поле значения какого-либо хэндла ..


 
i-s-v ©   (2004-12-10 13:27) [5]


> чего

Ну ладно... Это удалим... Но все-таки, почему не работает?


 
Digitman ©   (2004-12-10 13:34) [6]


> почему не работает?


а какие меры по отладке ты принимал самостоятельно ? и каковы их рез-ты ?


 
Erazzer   (2004-12-10 13:35) [7]

@MouseHook- убери собаку (@)


 
Digitman ©   (2004-12-10 13:59) [8]


> Erazzer   (10.12.04 13:35) [7]
> @MouseHook- убери собаку (@)


ерунду городишь


 
i-s-v ©   (2004-12-12 23:58) [9]

Со вторым вопросом я уже разобрался... Теперь более-менее работает... Но почему-то проводник во время работы программы вылетает с ошибкой...

> а какие меры по отладке ты принимал самостоятельно ?

Ну для начала удалил все из тела функции MouseHook:
function MouseHook(nCode, wParam, lParam: Integer): LResult; stdcall;
begin
end;

Все-равно вылетает...
Потом вместо
...SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0); написал
...SetWindowsHookEx(WH_KEyboard, @MouseHook, HInstance, 0); - заменил ловушку на события мыши на ловушку на события клавы.... И все стало нормально работать...
Странно... Или я чего-то не догоняю?...


 
Юрий Зотов ©   (2004-12-13 01:56) [10]

Попробуйте заменить
PostMessage(shareInf.appWndHandle, UM_MOUSEHOOK, wParam, lParam)
на
PostMessage(shareInf.appWndHandle, UM_MOUSEHOOK, 0, 0)

И в форме, в обработчике сообщения UM_MOUSEHOOK лучше все же сначала вызвать inherited. Хуже точно не будет, а для подстраховки не помешает (если не ошибаюсь, то в современных Win32 сообщение WM_USER + 101 уже входит в задействованный диапазон и глушить его стандартную обработку не стоит (либо уточните по свежей версии MSDN)).


 
i-s-v ©   (2004-12-13 09:51) [11]

Попробую... По-моему, все, что больше WM_USER, системой не используеться...


 
Юрий Зотов ©   (2004-12-13 12:17) [12]

> i-s-v ©   (13.12.04 09:51) [11]
> По-моему, все, что больше WM_USER, системой не используеться...

Так было раньше. Сейчас до WM_USER+100 используется точно (насколько помню, в comctl32), а в 2K/ME/XP, если не ошибаюсь, уже и дальше забрались. Нужно смотреть свежую MSDN.

Но в Вашем случае соль, видимо, не в inherited, а в указателе wParam. И, поскольку структуру Вы все равно не используете, то можно попробовать передавать просто нули.


 
Leonid Troyanovsky ©   (2004-12-13 16:43) [13]


> Юрий Зотов ©   (13.12.04 01:56) [10]

> И в форме, в обработчике сообщения UM_MOUSEHOOK лучше все
> же сначала вызвать inherited. Хуже точно не будет, а для
> подстраховки не помешает (если не ошибаюсь, то в современных
> Win32 сообщение WM_USER + 101 уже входит в задействованный
> диапазон и глушить его стандартную обработку не стоит (либо
> уточните по свежей версии MSDN)).


Формой (окном верхнего уровня) не используется.
Т.е., уточнять надо в свежей версии VCL.
Хотя, там используют другой диапазон - cm_base+

--
С уважением, LVT.


 
RT   (2004-12-16 10:06) [14]

...


 
Lin7   (2004-12-16 10:29) [15]


> MouseAlexander   (06.12.04 17:02)


В функции MouseHook LPARAM - указатель на структуру MOUSEHOOKSTRUCT - твои беды отсюда.

Удачи.


 
MouseAlexander   (2004-12-16 17:46) [16]

Ну если ты так уверен, то спасибо, проверим!!!


 
MouseAlexander   (2004-12-20 00:52) [17]

Все равно ощибка, именно теперь только при сворачивании или закрытия окна(например Мой компьтер)... И раскажите кто знает про Delphi 2005...


 
i-s-v ©   (2004-12-22 00:59) [18]


> Все равно ощибка, именно теперь только при сворачивании
> или закрытия окна(например Мой компьтер)... И раскажите
> кто знает про Delphi 2005...

На Кардачах его нет...


 
VMcL ©   (2004-12-22 07:52) [19]

>>MouseAlexander  (06.12.04 17:02)

1.
>procedure DLLEntryPoint(dwReason: DWORD); stdcall;
Не stdcall, а register.

2.
Код обработки сообщения UM_MOUSEHOOK в программе.


 
MouseAlexander   (2004-12-22 08:21) [20]

Delphi 2005 есть у меня на 3 CD!


 
MouseAlexander   (2004-12-23 08:29) [21]

Все ошибки нет, спасибо тебе большое VMcL!!!


 
MouseAlexander   (2004-12-23 08:32) [22]

Спасибо всем!


 
i-s-v ©   (2004-12-25 01:34) [23]

Thank"s To All



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

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

Наверх




Память: 0.53 MB
Время: 0.034 c
3-1103199107
stud
2004-12-16 15:11
2005.01.16
ошибка при попытке выполнения процедуры


11-1085338509
puky
2004-05-23 22:55
2005.01.16
Видели ?


1-1104150683
lm2
2004-12-27 15:31
2005.01.16
TService + запуск программы


1-1103893010
Dr. Genius
2004-12-24 15:56
2005.01.16
Упорядочивание файлов по дате их создания


14-1104219018
NewDelpher
2004-12-28 10:30
2005.01.16
Солдаты Великой Отечественной