Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.041 c
3-1102693499
Fedor
2004-12-10 18:44
2005.01.16
Вычисляемые поля


1-1104241599
snake_r
2004-12-28 16:46
2005.01.16
Свой хинт для каждого узла дерева


1-1104106961
dima hlevin
2004-12-27 03:22
2005.01.16
Как сохранит в exe файл моей программы строку а потом если надо е


6-1098805375
denissoft
2004-10-26 19:42
2005.01.16
Количество отправленных полученных байт.


9-1096449248
igan
2004-09-29 13:14
2005.01.16
Компромисс объем/сложность





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский