ОБСУЖДЕНИЕ

МЫша

21 ответов 10,6 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Как определить факт нажатия клавиши мыши твоей неактивной программой по любой точке монитора?
 
Учимся пользоваться поиском. Вот неплохая статья по глобальным хукам:

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

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

З.Ы. Если не секрет а для чего такое может понадобиться? Перехват клавиатуры часто для ловли глобальных горячих клавиш используют (или для клавиатурных шпионов :( ), а вот для чего нужно ловить мышку как-то не представляю.
 
хочу собрать программку которая будет меня будить когда засну на клавиатуре. :(
сидит в трее сильно не кушает а когда мышьку тыкать перестал сворачивает приложение и начинает допустим опрать (во бред!)
 
хочу собрать программку которая будет меня будить когда засну на клавиатуре. :(
сидит в трее сильно не кушает а когда мышьку тыкать перестал сворачивает приложение и начинает допустим орать (во бред!)
 
<!--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]

Не понял вопроса, что значит "установка ловушки вызываеться при нажатии клавиши"? Ловушку надо устанавливать один раз.
 
разобрался уже просто нужно было прогу DELETE и заново архив распоковать и все работет.
 
<!--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]
Может в таком случае проще было бы свой скринсевер написать и из него звуковой файлик проигрывать?
Хотя если "засну на клавиатуре" не оборот речи, то да.

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

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


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


Имхо первый способ всеже проще, тем более, что у тебя готовый пример под рукой.
 
Второй способ состоит в том, что при вызове процедуры по установке ловушки ты можешь передать в dll дополнительный параметр - адрес процедуры. Она будет находиться в основной программе, но вызывать ее будет ловушка, находящаяся в dl
Может я что то не так понял? Выходит мы в dll будем вызывать процедуру по адресу другого процесса? В лучшем случае это будет аксесс виолейшн.
 
Да, действительно, тут я ступил, для глобальных ловушек, которые грузятся в разные процессы второй метод неприменим.
 
ух как там много всего :unsure: но я осилил
на сколько я понял мне можно оформить передачу данных из DLL в программу через файл на HDD но лучше будет сделать через файл подкачки. Я правельно понял?
 
При передаче текущей информации через файлы у тебя возникнет серьезная проблема с синхронизацией - в какой момент читать и сколько, с какого смещения писать новую информацию, как очищать переданное, что делать если информация еще не считана, а уже надо передавать новую и т.д.

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

Смотри справку в 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. Только вот какой где не помню - поэкспериментируешь.

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

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