МЫша

Тема в разделе "Delphi - Система", создана пользователем LAF, 13 окт 2007.

Статус темы:
Закрыта.
  1. LAF

    LAF Гость

    Как определить факт нажатия клавиши мыши твоей неактивной программой по любой точке монитора?
     
  2. Silver Wind

    Silver Wind Гость

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

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

    Читаем теорию, смотрим пример и задаем конкретные вопросы о том, что непонятно.
     
  3. LAF

    LAF Гость

    оч интересно...
    на сколько я понял мне нужно работать над проектом в DLL который будет работать параллельно с моей программой перехватывая команды и фильтруюя и при нужной клавиши отправляя в программу сообщение я правельно понял? сори если флуд
     
  4. LAF

    LAF Гость

    и еще почему если установка ловушки вызываеться при нажатии клавиши все работает, а если мы ту же процедуру ставим на CreateForm то выдаеться ошибка?
     
  5. Silver Wind

    Silver Wind Гость

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

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

    LAF Гость

    хочу собрать программку которая будет меня будить когда засну на клавиатуре. :(
    сидит в трее сильно не кушает а когда мышьку тыкать перестал сворачивает приложение и начинает допустим опрать (во бред!)
     
  7. LAF

    LAF Гость

    хочу собрать программку которая будет меня будить когда засну на клавиатуре. :(
    сидит в трее сильно не кушает а когда мышьку тыкать перестал сворачивает приложение и начинает допустим орать (во бред!)
     
  8. Silver Wind

    Silver Wind Гость

    <!--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]

    Не понял вопроса, что значит "установка ловушки вызываеться при нажатии клавиши"? Ловушку надо устанавливать один раз.
     
  9. LAF

    LAF Гость

    разобрался уже просто нужно было прогу DELETE и заново архив распоковать и все работет.
     
  10. Silver Wind

    Silver Wind Гость

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

    А вообще неожиданная идея, а если просто по-маленькому отойдешь :)
     
  11. LAF

    LAF Гость

    а можно ли из длл передать в основную программу что либо если да то как?
     
  12. Silver Wind

    Silver Wind Гость

    <!--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-функция
     
  13. LAF

    LAF Гость

    а нельзя ли более подробно или ссылочку на нужную инфо?
     
  14. Silver Wind

    Silver Wind Гость

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

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


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


    Имхо первый способ всеже проще, тем более, что у тебя готовый пример под рукой.
     
  15. zubr

    zubr Гость

    Может я что то не так понял? Выходит мы в dll будем вызывать процедуру по адресу другого процесса? В лучшем случае это будет аксесс виолейшн.
     
  16. Silver Wind

    Silver Wind Гость

    Да, действительно, тут я ступил, для глобальных ловушек, которые грузятся в разные процессы второй метод неприменим.
     
  17. LAF

    LAF Гость

    ух как там много всего :unsure: но я осилил
    на сколько я понял мне можно оформить передачу данных из DLL в программу через файл на HDD но лучше будет сделать через файл подкачки. Я правельно понял?
     
  18. Silver Wind

    Silver Wind Гость

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

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

    tavis Гость

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

    Silver Wind Гость

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

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

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

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

Поделиться этой страницей