МЫша

  • Автор темы LAF
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L
#1
Как определить факт нажатия клавиши мыши твоей неактивной программой по любой точке монитора?
 
S

Silver Wind

#2
Учимся пользоваться поиском. Вот неплохая статья по глобальным хукам:

Hooks - аспекты реализации

Читаем теорию, смотрим пример и задаем конкретные вопросы о том, что непонятно.
 
L
#3
оч интересно...
на сколько я понял мне нужно работать над проектом в DLL который будет работать параллельно с моей программой перехватывая команды и фильтруюя и при нужной клавиши отправляя в программу сообщение я правельно понял? сори если флуд
 
L
#4
и еще почему если установка ловушки вызываеться при нажатии клавиши все работает, а если мы ту же процедуру ставим на CreateForm то выдаеться ошибка?
 
S

Silver Wind

#5
Да, если хочешь перехватить произвольное нажатие мыши, придется помимо exe-шника с основной программой создать dll-библиотеку для глобального хука, грузить ее в основной программе, и ловить от нее сообщения о наступлении нужного события.

З.Ы. Если не секрет а для чего такое может понадобиться? Перехват клавиатуры часто для ловли глобальных горячих клавиш используют (или для клавиатурных шпионов :( ), а вот для чего нужно ловить мышку как-то не представляю.
 
L
#6
хочу собрать программку которая будет меня будить когда засну на клавиатуре. :(
сидит в трее сильно не кушает а когда мышьку тыкать перестал сворачивает приложение и начинает допустим опрать (во бред!)
 
L
#7
хочу собрать программку которая будет меня будить когда засну на клавиатуре. :(
сидит в трее сильно не кушает а когда мышьку тыкать перестал сворачивает приложение и начинает допустим орать (во бред!)
 
S

Silver Wind

#8
<!--QuoteBegin-LAF+13:10:2007, 21:52 -->
<span class="vbquote">(LAF @ 13:10:2007, 21:52 )</span><!--QuoteEBegin-->и еще почему если установка ловушки вызываеться при нажатии клавиши все работает, а если мы ту же процедуру ставим на CreateForm то выдаеться ошибка?
[snapback]81672" rel="nofollow" target="_blank[/snapback]​
[/quote]

Не понял вопроса, что значит "установка ловушки вызываеться при нажатии клавиши"? Ловушку надо устанавливать один раз.
 
L
#9
разобрался уже просто нужно было прогу DELETE и заново архив распоковать и все работет.
 
S

Silver Wind

#10
<!--QuoteBegin-LAF+13:10:2007, 22:00 -->
<span class="vbquote">(LAF @ 13:10:2007, 22:00 )</span><!--QuoteEBegin-->сидит в трее сильно не кушает а когда мышьку тыкать перестал сворачивает приложение и начинает допустим орать
[snapback]81675" rel="nofollow" target="_blank[/snapback]​
[/quote]
Может в таком случае проще было бы свой скринсевер написать и из него звуковой файлик проигрывать?
Хотя если "засну на клавиатуре" не оборот речи, то да.

А вообще неожиданная идея, а если просто по-маленькому отойдешь :)
 
L
#11
а можно ли из длл передать в основную программу что либо если да то как?
 
S

Silver Wind

#12
<!--QuoteBegin-LAF+13:10:2007, 22:36 -->
<span class="vbquote">(LAF @ 13:10:2007, 22:36 )</span><!--QuoteEBegin-->а можно ли из длл передать в основную программу что либо если да то как?
[snapback]81680" rel="nofollow" target="_blank[/snapback]​
[/quote]

2 способа на вскидку:
1. посредством SendMessage/PostMessage
2. callback-функция
 
L
#13
а нельзя ли более подробно или ссылочку на нужную инфо?
 
S

Silver Wind

#14
Первый способ используется в 3-ем примере к приведенной выше статье.
Смотри строку
Код:
SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);
Здесь первый параметр это дескриптор главного окна твоей основной программы (куда посылается сообщение), его передают в dll при установке хука.
Второй параметр идентификатор сообщения, его получаем вот так
Код:
WM_MYKEYHOOK:= RegisterWindowMessage('WM_MYKEYHOOK');
Здесь строку 'WM_MYKEYHOOK' замени на какую-нибудь свою и она должна быть одинаковой в основной программе и в dll.
Третий и четвертый параметр числа типа DWORD, здесь можешь указать какие-то свои произвольные данные.

Ловля этого сообщения в основной программе осуществляется в перегруженном обработчике WndProc, смотри тот же пример.


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


Имхо первый способ всеже проще, тем более, что у тебя готовый пример под рукой.
 
Z
#15
Второй способ состоит в том, что при вызове процедуры по установке ловушки ты можешь передать в dll дополнительный параметр - адрес процедуры. Она будет находиться в основной программе, но вызывать ее будет ловушка, находящаяся в dl
Может я что то не так понял? Выходит мы в dll будем вызывать процедуру по адресу другого процесса? В лучшем случае это будет аксесс виолейшн.
 
S

Silver Wind

#16
Да, действительно, тут я ступил, для глобальных ловушек, которые грузятся в разные процессы второй метод неприменим.
 
L
#17
ух как там много всего :unsure: но я осилил
на сколько я понял мне можно оформить передачу данных из DLL в программу через файл на HDD но лучше будет сделать через файл подкачки. Я правельно понял?
 
S

Silver Wind

#18
При передаче текущей информации через файлы у тебя возникнет серьезная проблема с синхронизацией - в какой момент читать и сколько, с какого смещения писать новую информацию, как очищать переданное, что делать если информация еще не считана, а уже надо передавать новую и т.д.

Так что лучше присмотрись к SendMessage. Наступило необходимое событие - отправляешь сообщение с параметрами программе.
 
T

tavis

#19
День добрый.
Можешь подсказать как с помощью SendMessage имитировать открытие менюшки?
В итоге мне нужно получить эфект нажатия к примеру на меню "Файл", чтобы открылся список что с этим файлом можно делать: "Сохранить", Новый и т.п.
Очень нужно, а не знаю на какой козе подъехать:(
 
S

Silver Wind

#20
Открывать менюшку для этого вовсе не обязательно. Достаточно послать правильно сформированное сообщение.

Смотри справку в Win 32 Programmer`s Reference по слову WM_COMMAND.
В классическом Win32 приложении при выборе пункта меню именно такое сообщение отправляется программе. На счет программ на Delphi я в этом не совсем уверен, надо бы посмотреть.

Теперь по поводу параметров для этого сообщения.
1. Запускаешь WinSight - входит в стандартную поставку Delphi.
2. Теперь идем в меню Spy->Follow Focus - ставим птичку, чтобы ловить сообщения только от текущего окна.
3. Далее Messages->Options - снимаем все птички в группе Messages to tree. Далее в той же группе справа в списке находим и отмечаем сообщение WM_COMMAND.
4. Теперь Messages->Selected Windows.

Начиная с этого момента в нижней части программы будут логироваться все сообщения типа WM_COMMAND от текущего активного окна.

Вот теперь запускаем исследуемую программу (или переключаемя на ее запущеный экземпляр) и кликаем на интересующий нас пункт меню.

В логе после этого видим строку типа: 000000:00000000 "Заголовок окна проги" WM_COMMAND Dispatched Menu XXXXh YYYYh. Здесь нас интересуют числа XXXXh и YYYYh. Это 2 параметра сообщения w и l. Только вот какой где не помню - поэкспериментируешь.

Ну вот вобщем-то и все. Зная сообщение и его параметры можно его послать нужному окну.

З.Ы. Давно такого не делал, так что мог где-то что-то и запамятовать, воспринимай этот пост не как готовый алгоритм, а как направление в котором надо капать дальше. Отпишись что вышло в итоге.
 
Статус
Закрыто для дальнейших ответов.