0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 45

Имитация нажатия левой кнопки мыши

28.12.2016, 20:12. Показов 9178. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужна имитация нажатия левой кнопки мыши только для конкретного окна/программы, то есть не это:
Delphi
1
2
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Учитывая что номер левой кнопки мыши в Delphi это "1", приведу пример того что мне нужно:
Delphi
1
2
SellKey(GetForegroundWindow(), 01, KEYDOWN);
SellKey(GetForegroundWindow(), 01, KEYUP);
Главное чтобы
Delphi
1
GetKeyState(01)
ничего не заподозрил. Весь инет перерыл, давно ищу способ решить эту проблему...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.12.2016, 20:12
Ответы с готовыми решениями:

Имитация нажатия кнопки мыши через процедуру в коде
Есть типичная процедура OnMouseDown: procedure TForm1.IMD(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y:...

Имитация нажатия клавиш мыши
Здравствуйте. Мне нужно имитировать нажатия клавиш мыши после клики по определенной клавиши на клавиатуре. Задача такая: Нужно сделать...

Тренажёр мыши, нажатие левой и правой кнопки поочерёдно
Вообщем проблема такая, мне нужно сделать тренажёр мыши. Я всё сделал вроде, но есть одна проблемка. Изначально на форме видно Image1 и...

9
Житель Земли
 Аватар для DenNik
3003 / 3023 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
30.12.2016, 17:07
Цитата Сообщение от kristall000 Посмотреть сообщение
ничего не заподозрил.
интересно, как это он сделает
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
03.01.2017, 22:54
Точно незнаю но мне кажется то окно где ты собрался мышью нажать (сымитировать нажатие) оно должно быть сверху или я неправ?
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 45
08.01.2017, 13:09  [ТС]
Да, сверху. Активное окно, но нужно по нему нажать так, чтобы в моей программе "GetKeyState(01)" не изменился, а его значение каждый раз при keyup меняется с 0 на 1 и обратно. Нужно отправить какое либо сообщение по GetForegroundWindow() "01" keydown а затем keyup. Не знаю, понятно ли я объясняю(( Для чего мне это нужно? Это нужно для циклического клика левой кнопки в таймере, если она нажата, как бы, понимаете?
Delphi
1
2
3
4
5
6
7
8
9
10
11
//Нужен код для процедуры sendkey которую я привел в пример ниже
//GetKeyState возвращает глобальное состояние клавиши,
  //а sendkey нажимает клавишу не по всей системе, а только одному окну.
//Таймер 1мс.
begin
  if GetKeyState(01) < 0 then begin
    h:=GetForegroundWindow();
    sendkey(h, 01, keydown);
    sendkey(h, 01, keyup);
  end;
end;
Добавлено через 17 часов 52 минуты
Долго копая просторы интернета я нашел часть того что мне нужно. Этот код 1 раз кликает по тексту в активном окне Notepad. GetKeyState(01) не меняется, а клик происходит !)
Delphi
1
2
3
4
h2:=GetForegroundWindow;
h2:=FindWindowEx(h2, 0, 'Edit', nil);
postmessage(h2,WM_LBUTTONDOWN,0,(200 shl 16) + 200);
postmessage(h2,WM_LBUTTONUP,0,0);
Но здесь присутствует FindWindowEx к конкретному компоненту Edit в окне Notepad, это полный отстой, мне нужно по любой части окна.. Процедуру выше я использовал через горячие клавиши, и клик происходит по координатам 200x200 начиная с 0x0 в самом Edit'e, а нужно по активным координатам мыши Mouse.CursorPos.X и Mouse.CursorPos.Y

Основу нужного кода я нашел, помогите кто чем сможет, я практически вообще не понимаю как работает этот postmessage, в течение часа пытался наладить примитивный клик по координатам в компоненте.... :c

Подвох в том, что в конце концов этот клик должен отправляться в окно с fps игрой, возможно даже в полноэкранном режиме, но желательно чтобы работало в любой части Windows.
0
Житель Земли
 Аватар для DenNik
3003 / 3023 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.01.2017, 18:16
Цитата Сообщение от kristall000 Посмотреть сообщение
GetKeyState(01) не меняется
ты в который раз городишь ерунду, не понимая абсолютно, о чем речь!
ты в курсе, что вообще делает функция GetKeyState?

Добавлено через 2 минуты
Цитата Сообщение от kristall000 Посмотреть сообщение
нужно по нему нажать так, чтобы в моей программе "GetKeyState(01)" не изменился
эта фраза вообще не имеет смысла
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 45
08.01.2017, 19:02  [ТС]
DenNik, Вы только возмущаетесь, даже не пытаясь помочь или понять что мне нужно. Так и быть я отвечу на ваш вопрос
Цитата Сообщение от DenNik Посмотреть сообщение
ты в курсе, что вообще делает функция GetKeyState?
Возвращает значения: 0 и 1 сменяют друг друга по очереди, после отжатия клавиши.
-128 и -127 сменяют друг друга в момент зажатия после каждого раза.
Delphi
1
2
3
4
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
//Значение GetKeyState(1) = -128 или -127
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
//0 сменился на 1 или наоборот
Поймите, GetKeyState у меня должно использоваться в таймере, чтобы понять нажата ли физически левая кнопка, ибо другой функции я не знаю, но она возвращает программное состояние.
В конце концов мне нужно заменить mouse_event в этом коде:
Delphi
1
2
3
4
5
while GetKeyState(01) < 0 do begin
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
sleep(50);
end;
Должно осуществляться программное кликанье левой кнопки, пока зажата физическая левая кнопка, но ..mouse_event..MOUSEEVENTF_LEFTUP.. срабатывает так, будто была ЛКМ была отжата физически, хотя она все еще зажата. Если всё равно не понятно задавайте вопросы.
0
Житель Земли
 Аватар для DenNik
3003 / 3023 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.01.2017, 20:33
ну для начала неплохо было бы описать, так сказать, на пальцах, что должно происходить, ну например
"я нажимаю ЛКМ, когда курсор находится в правом углу, а имитация нажатия должна происходить где-то в другом месте"

а потом желательно объяснить, а для чего собственно, это нужно именно так? может это оттого, что ты не знаешь как правильно. Но без знания исходной задачи тебе здесь никто толком не поможет
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 45
08.01.2017, 21:52  [ТС]
DenNik, постараюсь объяснить почти как задачу в олимпиаде)
  1. Физически пальцем я нажимаю ЛКМ.
  2. Программа каждую 1мс. циклически проверяет: Зажата ли ЛКМ.
    Кликните здесь для просмотра всего текста
    Нужна именно ЛКМ.
  3. Если зажата то повторять цикл: 1)Нажать ЛКМ; 2)Отпустить ЛКМ; 3)Sleep(50);
    • После "2)Отпустить ЛКМ;" цикл не должен завершиться, т.к. я ещё не отпустил ЛКМ на мышке. (в этом и вся сложность)
    • Все нажатия/отжатия осуществляются по координатам, где сейчас находится курсор мыши на экране.
  4. Если я отпустил своим пальцем ЛКМ на мышке, то прекратить цикл и снова проверять: Зажата ли ЛКМ.
Во вложении пример нажатий из Paint'а, который я получил другим неудобным способом.
Миниатюры
Имитация нажатия левой кнопки мыши  
0
Житель Земли
 Аватар для DenNik
3003 / 3023 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
09.01.2017, 02:15
Цитата Сообщение от kristall000 Посмотреть сообщение
чтобы понять нажата ли физически левая кнопка,
ты не сможешь отследить это, ибо физическое нажатие посылает ТО ЖЕ самое сообщение системе, что и программное и нет никакой возможности определить, палец ли твой послал сообщение или некая программа. сообщение стало в общую цепочку и пошло на выполнение

Добавлено через 1 минуту
возможно я и ошибаюсь. копни в сторону хуков и при помощи хука отследи состояние клавиш мыши.
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 45
09.01.2017, 03:37  [ТС]
DenNik, в хуках я практически полный ноль, но да гугл в помощь, попробую разобраться, может что то и выйдет... А как же postmessage, о котором я писал в сообщении выше?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2017, 03:37
Помогаю со студенческими работами здесь

Запрет нажатия правой кнопки мыши в Edit
Как запретить вызов контекстного меня правой кнопкой мыши в Edit?

Эмуляция нажатия мыши или кнопки в не актвном окне
Можно ли как нибудь сделать нажатие мыши или клавиши F5 в не активном окне, без передачи фокуса окну? Добавлено через 2 часа 53 минуты...

Вычерчивание замкнутого контура (звезды) в точке нажатия кнопки мыши
Можете сделать готовый проект? Пожалуйста, разбираться времени нету, а домашнее задание сдать нужно ;) unit Stars_; interface uses ...

Составить программу, которая подсчитывает расстояние между точкой нажатия и отпускания кнопки мыши
На форме установлена метка (TLabel). Составить программу, которая подсчитывает расстояние между точкой нажатия и отпускания кнопки мыши

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

Новые блоги и статьи
Динамические массивы в C++ - создание и использование
NullReferenced 27.04.2025
Динамические массивы представляют собой один из фундаментальных инструментов программирования на C++, позволяющий создавать структуры данных, размер которых определяется во время выполнения. . .
Асинхронный JavaScript: Промисы, Async/Await и Fetch API
Reangularity 27.04.2025
Пользователь заходит на веб-страницу, нажимает кнопку и. . . ничего не происходит. Сайт словно замер. Через несколько секунд всё внезапно оживает, но пользователь уже успел закрыть вкладку. Знакомая. . .
Management on GitLab and repository management in Visual Studio code
jigi33 27.04.2025
- repo management on GitLab - CI/ CD in GitLab - VCS repository management in Visual Studio code (see attachments)
Kanban или Scrum - что выбрать?
EggHead 27.04.2025
Kanban и Scrum — уже много лет удерживают лидирующие позиции среди гибких подходов. Руководители проектов и команды разработчиков то и дело сталкиваются с дилеммой: какой из этих двух методов выбрать. . .
Кастомные Middleware на C# в ASP.NET Core
UnmanagedCoder 27.04.2025
Разработка веб-приложений сегодня мало напоминает монолитное программирование прошлых лет. На смену громоздким блокам кода пришла модульная архитектура, где каждый компонент выполняет строго. . .
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru