Help!! SetWindowsHookEx(WH_MOUSE,.) Глобально, как ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dr. Implex
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 25.11.2002 (Пн) 12:05
Откуда: Russia

Help!! SetWindowsHookEx(WH_MOUSE,.) Глобально, как ?

Сообщение Dr. Implex » 10.07.2003 (Чт) 10:44

Hi, people! У меня 5-кнопочная оптическая мыша Maxxtro, 4 и 5 кнопка в Линолеуме используются тупо. Хочу перехватывать их нажатия глобально, выполнять через свою резидентную прогу нужные команды, а Линолеуму посылать пустую виртуальную клавишу &H0. Все работает, но только локально на моей форме, а моя резидентная прога должна быть вообще без формы, т.е. мне надо поставить глобальный хук на мышу :roll: Полез на мелкомягкий MSDN - там исходники только на C++ нашел, а его знаю плохо, понял только, что в SetWindowsHookEx мне надо передать адрес какой-то библиотеки с помощью LoadLibrary :shock: Если кто с этим ковырялся, помогите плизззз... Заранее спасибо.

P.S. Если вам надо:

&H5 - 4-я кнопка мышки
&H6 - 5-я кнопка мышки
With respect, Dr. Implex

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.07.2003 (Чт) 10:51

На VB глобальный хук не поставишь.
Возьми эти исходники и скомпилируй ActiveX (или в инете поищи, полно бесплатных библиотек), а этот ActiveX подключи к своей программе.
Lasciate ogni speranza, voi ch'entrate.

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 10.07.2003 (Чт) 10:57

Установить hook на мышь:
hHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseProc, App.hInstance, App.ThreadID)

В модуле создай функцию:
Public Function MouseProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
дальше своя обработка.........

При выходе из программы:
UnhookWindowsHookEx hHook

[/b]

Dr. Implex
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 25.11.2002 (Пн) 12:05
Откуда: Russia

Сообщение Dr. Implex » 10.07.2003 (Чт) 11:10

Aleksej! Это локальный хук! Который работает только на форме программы!! А мне нужен такой, который будет перехватывать нажатия ВООБЩЕ ВЕЗДЕ И В ЛЮБОМ ОКНЕ!!!
Если параметр ThreadID равен 0, то хук ассоциируется со всеми процессами, но этого не достаточно! Нужно передать адрес библиотеки!!
With respect, Dr. Implex

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 10.07.2003 (Чт) 11:13

alibek писал(а):На VB глобальный хук не поставишь.
Возьми эти исходники и скомпилируй ActiveX (или в инете поищи, полно бесплатных библиотек), а этот ActiveX подключи к своей программе.


Почему не поставишь? Для установки глобального хука необходимо чтобы функция его обработки находилась в отдельной dll.
Правда есть исключения (глюк) для Win98 хук WH_JOURNALRECORD, который только глобальный можно спокойно пихать в модуль и он будет работать, а вот win2000 такое уже не проходит.
Где-то я даже видел готовую dll для установки глобальных хуков на клаву и мышь, написанную на VB, ща посмотрю...
Главное двигаться не быстрее, чем думает твоя голова.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 10.07.2003 (Чт) 11:15

Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 10.07.2003 (Чт) 11:21

MEMBER писал(а):@ Dr.Implex
http://www.vbrussian.com/Controls.asp?Page=4


Да, да именно его я имел ввиду :P
Главное двигаться не быстрее, чем думает твоя голова.

Dr. Implex
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 25.11.2002 (Пн) 12:05
Откуда: Russia

Сообщение Dr. Implex » 11.07.2003 (Пт) 9:57

Я уже нашел то, что надо:
Код: Выделить всё
SetWindowsHookEx(WH_JOURNALRECORD,Addressof MouseProc, 0, 0)

устанавливает глобальный хук, я так понял, на все виртуальные клавиши. Прога работает даже без формы, что радует. Но вот если из самой проги что-то неаккуратно сделать, то возникают ошибки типа "Out of stack, out of memory" с фатальным выходом из VB. Из чего я делаю вывод, что настройки моей проги должны быть выполнены в отдельном EXE-шнике, а в хукер передаваться через параметры командной строки. Это фигня вопрос. Но есть проблема: в хукере идут строки
Код: Выделить всё
Sub Main()
Interrupt=False
hHook=SetWindowswHookEx(WH_JOURNALRECORD,Addressof MouseProc, 0, 0)
Do While Not Interrupt
  DoEvents
Loop
UnhookWindowsHookEx hHook
End Sub

Без DoEvents в цикле никак нельзя, иначе после установки хука программа завершается (???). Так вотъ сейчас у меня в хукере в модуле прописано
Код: Выделить всё
Interrupt=True

если нажата 4-я кнопка мыши, но удобнее будет вырубать хукера из SystemTray. О том, чтобы запихивать в трей самого хукера не может быть и речи, чем он проще, тем меньше глюков. Значит в трей я пихаю прогу которая будет отвечать за настройки, но тогда мне надо передать в хукер значение переменной Interrupt. Как мне это сделать для случая, когда и настроечная программа и хукер запущены?? Можт кто знает, просто я мало работал с функциями для памяти. :roll:
With respect, Dr. Implex

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 11.07.2003 (Пт) 11:38

У меня Win98 и хук WH_JOURNALRECORD установленный в модуле проги (в смысле там функция обработки хука) работает глобально, правда через некоторое время (разное) тоже вылетает с такой же ошибкой - "Out of stack, out of memory" :) :( Я правда грешил на другой свой код, но судя по всему беда в неправильной реализации этого хука (а то что он в противоречии MSDN работает глобально без dll).

По поводу твоей беды, думаю мудрить не надо (прога которая при малейшем своем движении подвешивает винды - радости мало), а лучше, проще и надежнее засунуть хук в dll.

P.S. при засовывании в dll может возникнуть проблема передачи управления из твоей ловушки следующей, но для WH_JOURNALRECORD это-то как раз и не актуально, помойму (я конечно могу и ошибаться, но пусть меня тогда поправят) даже если ты не передашь, то система сама разберется и без тебя...
Главное двигаться не быстрее, чем думает твоя голова.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot] и гости: 20

    TopList