![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с ловушками... [D6, D7, Win95/98, WinME, Win2k, WinXP]
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 ?
не вижу нигде коде записи в это поле значения какого-либо хэндла ..