Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизПроблема с ловушками... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.039 c