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

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

Проблема с ловушками... [D6, D7, Win95/98, WinME, Win2k, WinXP]


Страницы:   1 2

MouseAlexander ©   (2004-12-06 17:02:00) 

Здравствуйте... И сразу к делу. Есть программа, которая использует ловушку на события
мыши (мышеловку :). При нажатии на среднюю кнопку мыши главное окно формы должно
показываться (если оно не было видимым) или исчезать... Вроде все просто... Но вот
проблемы:
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;
...

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


i-s-v   (2004-12-25 01:34:00) [1]

Thank's To All


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

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


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

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


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

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


VMcL   (2004-12-22 07:52:00) [5]

>> MouseAlexander  (06.12.04 17:02)

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

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


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


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

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


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

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


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

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


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


> MouseAlexander   (06.12.04 17:02)


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

Удачи.


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

...


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


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

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


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

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


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

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

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

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


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

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


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

Попробуйте заменить
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-12 23:58:00) [15]

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

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

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

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


Digitman   (2004-12-10 13:59:00) [16]


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


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


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

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


Digitman   (2004-12-10 13:34:00) [18]


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


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


i-s-v   (2004-12-10 13:27:00) [19]


> чего

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


Digitman   (2004-12-07 09:29:00) [20]


> CloseHandle(shareInf^.hm);


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


Страницы:   1 2

Наверх

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