1. Уважаемые участники и гости, 19 октября codeby будет работать в режиме "Только чтение". Регистрация новых участников будет закрыта. 20 октября портал продолжит работу в прежнем режиме.

МЫша

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

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

    LAF Гость

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

    Silver Wind Гость

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

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

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

    LAF Гость

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

    LAF Гость

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

    Silver Wind Гость

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

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

    LAF Гость

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

    LAF Гость

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

    Silver Wind Гость

    Репутация:
    0
    <!--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 Гость

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

    Silver Wind Гость

    Репутация:
    0
    <!--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 Гость

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

    Silver Wind Гость

    Репутация:
    0
    <!--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 Гость

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

    Silver Wind Гость

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

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


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


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

    zubr Гость

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

    Silver Wind Гость

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

    LAF Гость

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

    Silver Wind Гость

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

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

    tavis Гость

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

    Silver Wind Гость

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

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

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

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

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