Основы событий мыши
В этой главе мы более детально рассмотрим события мыши и их свойства.
Сразу заметим: эти события бывают не только из-за мыши, но и эмулируются на других устройствах, в частности, на мобильных, для совместимости.
Типы событий мыши
Мы уже видели некоторые из этих событий:
mousedown/mouseup Кнопка мыши нажата/отпущена над элементом. mouseover/mouseout Курсор мыши появляется над элементом и уходит с него. mousemove Каждое движение мыши над элементом генерирует это событие. click Вызывается при mousedown , а затем mouseup над одним и тем же элементом, если использовалась левая кнопка мыши. dblclick Вызывается двойным кликом на элементе. contextmenu Вызывается при попытке открытия контекстного меню, как правило, нажатием правой кнопки мыши. Но, заметим, это не совсем событие мыши, оно может вызываться и специальной клавишей клавиатуры.
…Есть также несколько иных типов событий, которые мы рассмотрим позже.
Порядок событий
Как вы можете видеть из приведённого выше списка, действие пользователя может вызвать несколько событий.
Например, клик мышью вначале вызывает mousedown , когда кнопка нажата, затем mouseup и click , когда она отпущена.
В случае, когда одно действие инициирует несколько событий, порядок их выполнения фиксирован. То есть обработчики событий вызываются в следующем порядке: mousedown → mouseup → click .
Кликните на кнопку ниже, и вы увидите события. Также попробуйте двойной клик.
В окне теста ниже все события мыши записываются, и если задержка между ними более 1 секунды, то они разделяются горизонтальной чертой.
Кроме того, мы можем видеть свойство button , которое позволяет нам определять кнопку мыши; это объясняется ниже.
Кнопки мыши
События, связанные с кликом, всегда имеют свойство button , которое позволяет получить конкретную кнопку мыши.
Обычно мы не используем его для событий click и contextmenu , потому что первое происходит только при щелчке левой кнопкой мыши, а второе – только при щелчке правой кнопкой мыши.
С другой стороны, обработчикам mousedown и mouseup может потребоваться event.button , потому что эти события срабатывают на любую кнопку, таким образом button позволяет различать «нажатие правой кнопки» и «нажатие левой кнопки».
Возможными значениями event.button являются:
Состояние кнопки | event.button |
---|---|
Левая кнопка (основная) | 0 |
Средняя кнопка (вспомогательная) | 1 |
Правая кнопка (вторичная) | 2 |
Кнопка X1 (назад) | 3 |
Кнопка X2 (вперёд) | 4 |
Большинство мышек имеют только левую и правую кнопку, поэтому возможные значения это 0 или 2. Сенсорные устройства также генерируют аналогичные события, когда кто-то нажимает на них.
Также есть свойство event.buttons , в котором все нажатые в данный момент кнопки представлены в виде целого числа, по одному биту на кнопку. На практике это свойство используется очень редко, вы можете найти подробную информацию по адресу MDN, если вам это когда-нибудь понадобится.
Устаревшее свойство event.which
В старом коде вы можете встретить event.which свойство – это старый нестандартный способ получения кнопки с возможными значениями:
- event.which == 1 – левая кнопка,
- event.which == 2 – средняя кнопка,
- event.which == 3 – правая кнопка.
На данный момент event.which устарел, нам не следует его использовать.
Средняя кнопка сейчас – скорее экзотика, и используется очень редко.
Модификаторы: shift, alt, ctrl и meta
Все события мыши включают в себя информацию о нажатых клавишах-модификаторах.
- shiftKey : Shift
- altKey : Alt (или Opt для Mac)
- ctrlKey : Ctrl
- metaKey : Cmd для Mac
Они равны true , если во время события была нажата соответствующая клавиша.
Например, кнопка внизу работает только при комбинации Alt + Shift +клик:
Внимание: обычно на Mac используется клавиша Cmd вместо Ctrl
В Windows и Linux клавишами-модификаторами являются Alt , Shift и Ctrl . На Mac есть ещё одна: Cmd , которой соответствует свойство metaKey .
В большинстве приложений, когда в Windows/Linux используется Ctrl , на Mac используется Cmd .
То есть, когда пользователь Windows нажимает Ctrl + Enter и Ctrl + A , пользователь Mac нажимает Cmd + Enter или Cmd + A , и так далее.
Поэтому, если мы хотим поддерживать такие комбинации, как Ctrl +клик, то для Mac имеет смысл использовать Cmd +клик. Это удобней для пользователей Mac.
Даже если мы и хотели бы заставить людей на Mac использовать именно Ctrl +клик, это довольно сложно. Проблема в том, что левый клик в сочетании с Ctrl интерпретируется как правый клик на MacOS и генерирует событие contextmenu , а не click как на Windows/Linux.
Поэтому, если мы хотим, чтобы пользователям всех операционных систем было удобно, то вместе с ctrlKey нам нужно проверять metaKey .
Для JS-кода это означает, что мы должны проверить if (event.ctrlKey || event.metaKey) .
Не забывайте про мобильные устройства
Комбинации клавиш хороши в качестве дополнения к рабочему процессу. Так что, если посетитель использует клавиатуру – они работают.
Но если на их устройстве его нет – тогда должен быть способ жить без клавиш-модификаторов.
Координаты: clientX/Y, pageX/Y
Все события мыши имеют координаты двух видов:
- Относительно окна: clientX и clientY .
- Относительно документа: pageX и pageY .
Мы уже рассмотрели разницу между ними в главе Координаты.
Если в кратце, то относительные координаты документа pageX/Y отсчитываются от левого верхнего угла документа и не меняются при прокрутке страницы, в то время как clientX/Y отсчитываются от левого верхнего угла текущего окна. Когда страница прокручивается, они меняются.
Например, если у нас есть окно размером 500×500, и курсор мыши находится в левом верхнем углу, то значения clientX и clientY равны 0 , независимо от того, как прокручивается страница.
А если мышь находится в центре окна, то значения clientX и clientY равны 250 независимо от того, в каком месте документа она находится и до какого места документ прокручен. В этом они похожи на position:fixed .
Наведите курсор мыши на поле ввода, чтобы увидеть clientX/clientY (пример находится в iframe , поэтому координаты определяются относительно этого iframe ):
Координаты относительно документа pageX , pageY отсчитываются не от окна, а от левого верхнего угла документа. Подробнее о координатах вы можете узнать в главе Координаты.
Отключаем выделение
Двойной клик мыши имеет побочный эффект, который может быть неудобен в некоторых интерфейсах: он выделяет текст.
Например, двойной клик на текст ниже выделяет его в дополнение к нашему обработчику:
Сделайте двойной клик на мне
Если зажать левую кнопку мыши и, не отпуская кнопку, провести мышью, то также будет выделение, которое в интерфейсах может быть «не кстати».
Есть несколько способов запретить выделение, о которых вы можете прочитать в главе Selection и Range.
В данном случае самым разумным будет отменить действие браузера по умолчанию при событии mousedown , это отменит оба этих выделения:
До. Сделайте двойной клик на мне . После
Теперь выделенный жирным элемент не выделяется при двойном клике, а также на нём нельзя начать выделение, зажав кнопку мыши.
Заметим, что текст внутри него по-прежнему можно выделить, если начать выделение не на самом тексте, а до него или после. Обычно это нормально воспринимается пользователями.
Предотвращение копирования
Если мы хотим отключить выделение для защиты содержимого страницы от копирования, то мы можем использовать другое событие: oncopy .
Уважаемый пользователь, Копирование информации запрещено для вас. Если вы знаете JS или HTML, вы можете найти всю нужную вам информацию в исходном коде страницы.
Если вы попытаетесь скопировать текст в , у вас это не получится, потому что срабатывание события oncopy по умолчанию запрещено.
Конечно, пользователь имеет доступ к HTML-коду страницы и может взять текст оттуда, но не все знают, как это сделать.
Итого
События мыши имеют следующие свойства:
- Кнопка: button .
- Клавиши-модификаторы ( true если нажаты): altKey , ctrlKey , shiftKey и metaKey (Mac).
- Если вы планируете обработать Ctrl , то не забудьте, что пользователи Mac обычно используют Cmd , поэтому лучше проверить if (e.metaKey || e.ctrlKey) .
Действие по умолчанию события mousedown – начало выделения, если в интерфейсе оно скорее мешает, его можно отменить.
В следующей главе мы поговорим о событиях, которые возникают при передвижении мыши, и об отслеживании смены элементов под указателем.
Задачи
Выделяемый список
важность: 5
Создайте список, в котором элементы могут быть выделены, как в файловых менеджерах.
- При клике на элемент списка выделяется только этот элемент (добавляется класс .selected ), отменяется выделение остальных элементов.
- Если клик сделан вместе с Ctrl ( Cmd для Mac), то выделение переключается на элементе, но остальные элементы при этом не изменяются.
P.S. В этом задании все элементы списка содержат только текст. Без вложенных тегов.
P.P.S. Предотвратите стандартное для браузера выделение текста при кликах.
Мышь: клики, кнопка, координаты
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/mouse-events-basics.
В этой главе мы глубже разберёмся со списком событий мыши, рассмотрим их общие свойства, а также те события, которые связаны с кликом.
Типы событий мыши
Условно можно разделить события на два типа: «простые» и «комплексные».
Простые события
mousedown Кнопка мыши нажата над элементом. mouseup Кнопка мыши отпущена над элементом. mouseover Мышь появилась над элементом. mouseout Мышь ушла с элемента. mousemove Каждое движение мыши над элементом генерирует это событие.
Комплексные события
click Вызывается при клике мышью, то есть при mousedown , а затем mouseup на одном элементе contextmenu Вызывается при клике правой кнопкой мыши на элементе. dblclick Вызывается при двойном клике по элементу.
Комплексные можно составить из простых, поэтому в теории можно было бы обойтись вообще без них. Но они есть, и это хорошо, потому что с ними удобнее.
Порядок срабатывания событий
Одно действие может вызывать несколько событий.
Например, клик вызывает сначала mousedown при нажатии, а затем mouseup и click при отпускании кнопки.
В тех случаях, когда одно действие генерирует несколько событий, их порядок фиксирован. То есть, обработчики вызовутся в порядке mousedown → mouseup → click .
Кликните по кнопке ниже и вы увидите, какие при этом происходят события. Попробуйте также двойной клик.
На тест-стенде ниже все мышиные события записываются, и если между событиями проходит больше 1 секунды, то они для удобства чтения отделяются линией. Также присутствуют свойства which/button , по которым можно определить кнопку мыши. Мы их рассмотрим далее.
Каждое событие обрабатывается независимо.
Например, при клике события mouseup + click возникают одновременно, но обрабатываются последовательно. Сначала полностью завершается обработка mouseup , затем запускается click .
Получение информации о кнопке: which
При обработке событий, связанных с кликами мыши, бывает важно знать, какая кнопка нажата.
Для получения кнопки мыши в объекте event есть свойство which .
На практике оно используется редко, т.к. обычно обработчик вешается либо onclick – только на левую кнопку мыши, либо oncontextmenu – только на правую.
Возможны следующие значения:
- event.which == 1 – левая кнопка
- event.which == 2 – средняя кнопка
- event.which == 3 – правая кнопка
Это свойство не поддерживается IE8-, но его можно получить способом, описанным в конце главы.
Правый клик: oncontextmenu
Это событие срабатывает при клике правой кнопкой мыши:
Правый клик на этой кнопке выведет "Клик".При клике на кнопку выше после обработчика oncontextmenu будет показано обычное контекстное меню, которое браузер всегда показывает при клике правой кнопкой. Это является его действием по умолчанию.
Если мы не хотим, чтобы показывалось встроенное меню, например потому что показываем своё, специфичное для нашего приложения, то можно отменить действие по умолчанию.
В примере ниже встроенное меню показано не будет:
Модификаторы shift, alt, ctrl и meta
Во всех событиях мыши присутствует информация о нажатых клавишах-модификаторах.
- shiftKey
- altKey
- ctrlKey
- metaKey (для Mac)
Например, кнопка ниже сработает только на Alt+Shift+Клик:
document.body.children[0].onclick = function(e)
Внимание: на Mac вместо Ctrl используется Cmd
На компьютерах под управлением Windows и Linux есть специальные клавиши Alt , Shift и Ctrl . На Mac есть ещё одна специальная клавиша: Cmd , которой соответствует свойство metaKey .
В большинстве случаев там, где под Windows/Linux используется Ctrl , на Mac используется Cmd . Там, где пользователь Windows нажимает Ctrl + Enter или Ctrl + A , пользователь Mac нажмёт Cmd + Enter или Cmd + A , и так далее, почти всегда Cmd вместо Ctrl .
Поэтому, если мы хотим поддерживать сочетание Ctrl +click или другие подобные, то под Mac имеет смысл использовать Cmd +click. Пользователям Mac это будет гораздо комфортнее.
Более того, даже если бы мы хотели бы заставить пользователей Mac использовать именно Ctrl +click – это было бы затруднительно. Дело в том, что обычный клик с зажатым Ctrl под Mac работает как правый клик и генерирует событие oncontextmenu , а вовсе не onclick , как под Windows/Linux.
Решение – чтобы пользователи обоих операционных систем работали с комфортом, в паре с ctrlKey нужно обязательно использовать metaKey .
В JS-коде это означает, что для удобства пользователей Mac нужно проверять if (event.ctrlKey || event.metaKey) .
Координаты в окне: clientX/Y
Все мышиные события предоставляют текущие координаты курсора в двух видах: относительно окна и относительно документа.
Пара свойств clientX/clientY содержит координаты курсора относительно текущего окна.
При этом, например, если ваше окно размером 500×500, а мышь находится в центре, тогда и clientX и clientY будут равны 250.
Можно как угодно прокручивать страницу, но если не двигать при этом мышь, то координаты курсора clientX/clientY не изменятся, потому что они считаются относительно окна, а не документа.
Проведите мышью над полем ввода, чтобы увидеть clientX/clientY :
В той же системе координат работает и метод elem.getBoundingClientRect() , возвращающий координаты элемента, а также position:fixed .
Относительно документа: pageX/Y
Координаты курсора относительно документа находятся в свойствах pageX/pageY .
Так как эти координаты – относительно левого-верхнего узла документа, а не окна, то они учитывают прокрутку. Если прокрутить страницу, а мышь не трогать, то координаты курсора pageX/pageY изменятся на величину прокрутки, они привязаны к конкретной точке в документе.
В IE8- этих свойств нет, но можно получить их способом, описанным в конце главы.
Проведите мышью над полем ввода, чтобы увидеть pageX/pageY (кроме IE8-):
В той же системе координат работает position:absolute , если элемент позиционируется относительно документа.
Устарели: x, y, layerX, layerY
Некоторые браузеры поддерживают свойства event.x/y , event.layerX/layerY .
Эти свойства устарели, они нестандартные и не добавляют ничего к описанным выше. Использовать их не стоит.
Особенности IE8-
Двойной клик
Все браузеры, кроме IE8-, генерируют dblclick в дополнение к другим событиям.
- mousedown (нажал)
- mouseup+click (отжал)
- mousedown (нажал)
- mouseup+click+dblclick (отжал).
IE8- на втором клике не генерирует mousedown и click .
- mousedown (нажал)
- mouseup+click (отжал)
- (нажал второй раз, без события)
- mouseup+dblclick (отжал).
Поэтому отловить двойной клик в IE8-, отслеживая только click , нельзя, ведь при втором нажатии его нет. Нужно именно событие dblclick .
Свойство which/button
В старых IE8- не поддерживалось свойство which , а вместо него использовалось свойство button , которое является 3-х битным числом, в котором каждому биту соответствует кнопка мыши. Бит установлен в 1, только если соответствующая кнопка нажата.
Чтобы его расшифровать – нужна побитовая операция & («битовое И»):
- !!(button & 1) == true (1-й бит установлен), если нажата левая кнопка,
- !!(button & 2) == true (2-й бит установлен), если нажата правая кнопка,
- !!(button & 4) == true (3-й бит установлен), если нажата средняя кнопка.
Что интересно, при этом мы можем узнать, были ли две кнопки нажаты одновременно, в то время как стандартный which такой возможности не даёт. Так что, в некотором смысле, свойство button – более мощное.
Можно легко сделать функцию, которая будет ставить свойство which из button , если его нет:
function fixWhich(e) < if (!e.which && e.button) < // если which нет, но есть button. (IE8-) if (e.button & 1) e.which = 1; // левая кнопка else if (e.button & 4) e.which = 2; // средняя кнопка else if (e.button & 2) e.which = 3; // правая кнопка >>
Свойства pageX/pageY
В IE до версии 9 не поддерживаются свойства pageX/pageY , но их можно получить, прибавив к clientX/clientY величину прокрутки страницы.
Более подробно о её вычислении вы можете прочитать в разделе прокрутка страницы.
Мы же здесь приведём готовый вариант, который позволяет нам получить pageX/pageY для старых и совсем старых IE:
function fixPageXY(e) < if (e.pageX == null && e.clientX != null) < // если нет pageX.. var html = document.documentElement; var body = document.body; e.pageX = e.clientX + (html.scrollLeft || body && body.scrollLeft || 0); e.pageX -= html.clientLeft || 0; e.pageY = e.clientY + (html.scrollTop || body && body.scrollTop || 0); e.pageY -= html.clientTop || 0; >>
Итого
События мыши имеют следующие свойства:
- Кнопка мыши: which (для IE8-: нужно ставить из button )
- Элемент, вызвавший событие: target
- Координаты, относительно окна: clientX/clientY
- Координаты, относительно документа: pageX/pageY (для IE8-: нужно ставить по clientX/Y и прокрутке)
- Если зажата спец. клавиша, то стоит соответствующее свойство: altKey , ctrlKey , shiftKey или metaKey (Mac).
- Для поддержки Ctrl + click не забываем проверить if (e.metaKey || e.ctrlKey) , чтобы пользователи Mac тоже были довольны.
Задачи
Дерево: проверка клика на заголовке
важность: 3
Есть кликабельное JavaScript-дерево UL/LI (см. задачу Раскрывающееся дерево).
При клике на заголовке его список его детей скрывается-раскрывается. Выглядит это так: (кликайте на заголовки)
Однако, проблема в том, что скрытие-раскрытие происходит даже при клике вне заголовка, на пустом пространстве справа от него.
Как скрывать/раскрывать детей только при клике на заголовок?
В задаче Раскрывающееся дерево это решено так: заголовки завёрнуты в элементы SPAN и проверяются клики только на них. Представим на минуту, что мы не хотим оборачивать текст в SPAN , а хотим оставить как есть. Например, по соображениям производительности, если дерево и так очень большое, ведь оборачивание всех заголовков в SPAN увеличит количество DOM-узлов в 2 раза.
Решите задачу без обёртывания заголовков в SPAN , используя работу с координатами.
Исходный документ содержит кликабельное дерево.
P.S. Задача – скорее на сообразительность, однако подход может быть полезен в реальной жизни.
Подсказка
У события клика есть координаты. Проверьте по ним, попал ли клик на заголовок.
Самый глубокий узел на координатах можно получить вызовом document.elementFromPoint(clientX, clientY).
…Но заголовок является текстовым узлом, поэтому эта функция для него работать не будет. Однако это, всё же, можно обойти. Как?
Подсказка 2
Подсказка 2
Можно при клике на LI сделать временный SPAN и переместить в него текстовый узел-заголовок.
После этого проверить, попал ли клик в него и вернуть всё как было.
// 1) заворачиваем текстовый узел в SPAN // 2) проверяем var elem = document.elementFromPoint(e.clientX, e.clientY); var isClickOnTitle = (elem == span); // 3) возвращаем текстовый узел обратно из SPAN
На шаге 3 текстовый узел вынимается обратно из SPAN , всё возвращается в исходное состояние.
Отслеживание нажатие левой кнопки мыши и получение координат курсора
Как можно в программе отследить, что была нажата левая кнопка мыши и при возможности узнать координаты курсора?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:Получение координат курсора при нажатии левой клавиши мыши
Короче, чтоб долго тут не повествовать, объясните, почему не работает код: uses mouse, crt; begin.Нажатие левой кнопки мыши
Как только не пробовал, но чо-то не могу условие такое написать. Help me! За ранее благодаренНажатие левой кнопки мыши
господа создаю основное окно , а затем с этим же классом создаю дочернее окно вот так #include.153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
Отлавливай сообщение WM_LBUTTONDOWN, а позицию курсора с помощью GetCursorPos
Регистрация: 26.04.2014
Сообщений: 6
В том то и дело, что мне надо без подключения WinAPI, в консольном графическом режиме4467 / 2701 / 484
Регистрация: 28.04.2012
Сообщений: 8,558
В «консольном режиме» нет мыши и координат курсора, какое-то API ОС все равно придется использовать.
Регистрация: 26.04.2014
Сообщений: 6Сообщение от korvin_
В консольном режиме нет мыши и координат курсора.
в dos режиме через прерывание сделал указатель, и вопрос как через него теперь отследить нажатие(или просто клик)
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесьНажатие левой кнопки мыши
Решил написать скрипт для игры. Чтобы скрипт сам нажимал левую кнопку мыши, когда прицел будет.Программное нажатие левой кнопки мыши
Господа, кто нить подскажет как можно заставить программу нажимать левую кнопку мыши. Пробовал.Отловить нажатие левой кнопки мыши
Всем привет, я совсем новичок, пытаюсь отловить событие — нажатие кнопок мыши, но к сожалению не.Самостоятельное нажатие левой кнопки мыши
Добрый день друзья. Весь интернет прошерстил, так и не смог найти решение. Проблема такова, что.Работа с мышью
Я не привожу ни одной строчки кода.
Вопрос таков.
Как реализовать такой алгоритм:
В цикле получать координаты курсора мыши и показывать их пользователю.
В этом же цикле следить (не нажата ли левая кнопка мыши (ЛКМ))
Как только нажали ЛКМ — вызвать функцию (получить координаты курсора мыши из нажатия ЛКМ
и пока удерживается ЛКМ присваивать эти координаты курсору мыши).Поделиться224.05.2010 18:35:51
- Автор: Пётр
- Активный участник
- Зарегистрирован : 14.06.2009
- Приглашений: 0
- Сообщений: 2880
- Уважение: [+96/-5]
- Позитив: [+1/-0]
- Пол: Мужской
- Провел на форуме:
2 месяца 7 дней - Последний визит:
Вчера 15:41:35
Вот заготовка проги.
Код:
Procedure TimerMouse() ; Процедура вызывается по таймеру Temp.POINT GetCursorPos_(@Temp) ; Текузая позиция курсора мышки относительно экрана SetGadgetText(1,"Y = "+Str(Temp\y)) SetGadgetText(2,"X = "+Str(Temp\x)) If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки SetGadgetText(3,"Нажата ЛКМ") Else SetGadgetText(3,"") EndIf EndProcedure If OpenWindow(0,4,4,90,70,"Pos", #PB_Window_MinimizeGadget) StickyWindow(0,1) TextGadget(1,10,10,70,16, "Y") TextGadget(2,10,28,70,16,"X") TextGadget(3,10,48,80,16,"") SetTimer_(WindowID(0), 2, 40, @TimerMouse() ) ; Запуск таймера Repeat Event=WaitWindowEvent() Until Event=#PB_Event_CloseWindow KillTimer_(WindowID(0), 2) EndIf End
Поделиться325.05.2010 01:05:24
- Автор: Юрий
- Участник
- Зарегистрирован : 03.04.2010
- Приглашений: 0
- Сообщений: 19
- Уважение: [+0/-0]
- Позитив: [+0/-0]
- Пол: Мужской
- Возраст: 48 [1974-12-16]
- Провел на форуме:
10 часов 35 минут - Последний визит:
20.06.2010 22:15:07
Петр.
Спасибо Вам.
Признаюсь честно — я пишу в основном на AutoIt.
Вы знакомы с этим языком?
Но PureBasic для меня — это супер находка.
Но очень большая проблема у меня — не дружу с английским.
Потому мне тяжело и в AutoIt и в PureBasic.
Ну, а вообще, мир программирования начал постигать с Sign 0f Misery.Вот тот код, мной написанный, что я спрашивал, но на AutoIt:
Код:
#Include While 1 Sleep (50) $pos = MouseGetPos() ; получить текущие координыты указателя мыши ToolTip("Mouse x,y: "& $pos[0] & "," & $pos[1], 0, 0) ; вывести визуально эти координаты If _IsPressed(01) = 1 Then ; если вдруг нажмем ЛКМ, - вызвать функцию "MyCoordinate" Call("MyCoordinate") EndIf WEnd Func MyCoordinate() While _IsPressed(01) = 1 ; пока зажата ЛКМ выполнять Sleep (20) MouseMove($pos[0], $pos[1], 1) ; устанавливать указатель по этим координатам WEnd EndFunc
Но прошу не выгонять из форума и т.п.
Поделиться425.05.2010 10:40:59
- Автор: Пётр
- Активный участник
- Зарегистрирован : 14.06.2009
- Приглашений: 0
- Сообщений: 2880
- Уважение: [+96/-5]
- Позитив: [+1/-0]
- Пол: Мужской
- Провел на форуме:
2 месяца 7 дней - Последний визит:
Вчера 15:41:35
Нет, с AutoIt я не знаком.
Мне не совсем понятно что значит «пока удерживается ЛКМ присваивать эти координаты курсору мыши».
Судя из программы на AutoIt, если нажата ЛКМ, то нужно запретить перемещение кусора мышки, я правильно понял?Тогда нужно использовать API функцию SetCursorPos.
Да, это нужно производить в пределах окна прогаммы, или по всему экрану и в других программах тоже?Код:
Procedure TimerMouse() ; Процедура вызывается по таймеру Static x,y, State Temp.POINT GetCursorPos_(@Temp) ; Текузая позиция курсора мышки относительно экрана SetGadgetText(1,"Y = "+Str(Temp\y)) SetGadgetText(2,"X = "+Str(Temp\x)) If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки If State=0 x=Temp\x y=Temp\y EndIf State=1 SetGadgetText(3,"Нажата ЛКМ") SetCursorPos_(x, y) Else State=0 SetGadgetText(3,"") EndIf EndProcedure If OpenWindow(0,4,4,90,70,"Pos", #PB_Window_MinimizeGadget) StickyWindow(0,1) TextGadget(1,10,10,70,16, "Y") TextGadget(2,10,28,70,16,"X") TextGadget(3,10,48,80,16,"") SetTimer_(WindowID(0), 2, 40, @TimerMouse() ) ; Запуск таймера Repeat Event=WaitWindowEvent() Until Event=#PB_Event_CloseWindow KillTimer_(WindowID(0), 2) EndIf End
Поделиться529.05.2010 10:44:18
- Автор: Юрий
- Участник
- Зарегистрирован : 03.04.2010
- Приглашений: 0
- Сообщений: 19
- Уважение: [+0/-0]
- Позитив: [+0/-0]
- Пол: Мужской
- Возраст: 48 [1974-12-16]
- Провел на форуме:
10 часов 35 минут - Последний визит:
20.06.2010 22:15:07
Петр.
Спасибо.
Вы спрашивали:
«Мне не совсем понятно что значит «пока удерживается ЛКМ присваивать эти координаты курсору мыши».
Судя из программы на AutoIt, если нажата ЛКМ, то нужно запретить перемещение кусора мышки, я правильно понял?»Пока зажата ЛКМ — надо постоянно присваивать курсору мыши те координаты, которые были на момент события клика ЛКМ.
Цель — игра Counter Strike Source (просто так для интереса)
В процессе игры при стрельбе из автомата Калашникова добиться
максимальной кучности стрельбы (из-за отдачи идет рассеивание пуль от цели путем перемещения координат прицела вверх и чуть в сторону).
Прицел постоянно находится по центру карты игры.
Сама карта перемещается относительно прицела.
Попытки командования мышью в данном процессе в AutoIt и PureBasic — без результата.
Думал сначала, что защита.
Но в Sign 0f Misery проверил и удивился — это получается.
Просто уже почти забыл Sign 0f Misery да и синтаксис там тяжеловат и многих функций не хватает.
Возможно (я точно не знаю) тут нужен чистый API.Поделиться629.05.2010 20:28:23
- Автор: Пётр
- Активный участник
- Зарегистрирован : 14.06.2009
- Приглашений: 0
- Сообщений: 2880
- Уважение: [+96/-5]
- Позитив: [+1/-0]
- Пол: Мужской
- Провел на форуме:
2 месяца 7 дней - Последний визит:
Вчера 15:41:35
Юрий написал(а):
Так чистый API и используется!
Другое дело что игры используют DirectX для работы с мышкой и клавиатурой.
Тут нужен глобальный хук мышки и то не факт что сработает.Поделиться721.12.2010 14:08:40
- Автор: imeli
- Новичок
- Зарегистрирован : 21.12.2010
- Приглашений: 0
- Сообщений: 4
- Уважение: [+0/-0]
- Позитив: [+0/-0]
- Провел на форуме:
41 минуту - Последний визит:
21.12.2010 17:30:59
А можно сделать так, чтобы
курсор становился на определенные координаты,
затем выполнял действие(т.е. автоматически нажималась ЛКМ),
через несколько секунд переход на другие координаты, выполнял действие,
и т.д.Поделиться821.12.2010 15:35:36
- Автор: Lucagin
- Активный участник
- Зарегистрирован : 07.12.2010
- Приглашений: 0
- Сообщений: 272
- Уважение: [+1/-0]
- Позитив: [+1/-0]
- Провел на форуме:
6 дней 7 часов - Последний визит:
02.09.2012 10:19:40
imeli написал(а):
А можно сделать так, чтобыкурсор становился на определенные координаты,затем выполнял действие(т.е. автоматически нажималась ЛКМ),через несколько секунд переход на другие координаты, выполнял действие,и т.д.
Мне кажется блокировать мышь или ограничивать её перемещение во время стрельбы не совсем корректно. Если противник прыгнет или присядет или начнет уходить в бок, но блокировка мыши сделает только хуже. У тебя по идее не мышь уходит вверх а координаты попадания пули смещаются относительно курсора мыши.
Тут по идее надо просчитать зависимость смешения высоты пули от времени непрерывной стрельбы (время зажатой ЛКМ). Т.е. определить зависимости смешения вверх и вбок пули от количества Милисекунд непрерывной стрельбы (зажатой ЛКМ) а потом просто в координаты мышки вносить эту поправку, каждые допустим 100 Мсек.
Или можно ввести намеренную паузу в стрельбе. Т.е. при зажатой ЛКМ после 3-х выстрелов делать паузу хоть в пол секунды или меньше, чтобы кучность стрельбы не сильно портилась… Вроде при 3-х, 5-ти выстрелах кучность практически не страдает..Или после 3-5 выстрелов делать автоматическую смену на пистолет, а потом обратно. Все это привязать к Мсек.,которые зажата ЛКМ…Отредактировано Lucagin (21.12.2010 15:39:49)