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

Клики левой кнопки мыши по таймеру, при зажатой левой кнопке мыши (user32.lib)

27.05.2018, 22:50. Показов 2984. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане, взорвался мозг. Помогите.
Есть одна, по мне, невыполнимая, задача, которую я уже очень долго не могу решить.
Мне нужно сделать макрос на левую кнопку мыши, которая при зажиме левой кнопки будет кликать её же (левую кнопку мыши), а при отпускании, останавливать таймер и прекращать клики.

Моя логика остановилась на том моменте, что при отпуске кнопки таймером, срабатывает событие «LEFTUP», которое останавливает сам таймер и цикл прекращается.

То есть:
Я нажимаю пальцем на кнопку мыши и вызываю событие «Mouse_Left_Down», оно мне стартует таймер «Timer1.Start()»

В то же время таймер нажимает левую кнопку программно «mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)», включает счетчик и через некоторое время таймер должен отпустить кнопку так, чтобы сам таймер не отключился событием «Mouse_Left_Up», в котором есть команда на отключение «Timer1.Stop()».

Как только в таймере дело доходит до «mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)», таймер выключается, все логично.

Как сделать так, чтобы таймер выключался тогда, когда я пальцем отпущу левую кнопку мыши сам?!

Сама затея работает нормально с проигрываем звуков (подсунул для наглядности), так как звуки не вызывают «Mouse_Left_Up».

Вот сам код:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Imports System.Runtime.InteropServices
 
Public Class Form1
 
#Region "Урезанный класс MouseHookCrop"
 
    Private Class MouseHookCrop
        Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As MouseProcDelegate, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
        Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As MSLLHOOKSTRUCT) As Integer
        Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer
        Private Delegate Function MouseProcDelegate(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MSLLHOOKSTRUCT) As Integer
 
        Private Structure MSLLHOOKSTRUCT
            Public pt As Point
            Public mouseData As Integer
            Public flags As Integer
            Public time As Integer
            Public dwExtraInfo As Integer
        End Structure
 
        Private Const HC_ACTION As Integer = 0
        Private Const WH_MOUSE_LL As Integer = 14
        Private Const WM_LBUTTONDOWN As Integer = &H201
        Private Const WM_LBUTTONUP As Integer = &H202
 
        Private MouseHookCrop As Integer
        Private MouseHookDelegate As MouseProcDelegate
 
        Public Event Mouse_Left_Down(ByVal ptLocat As Point)
        Public Event Mouse_Left_Up(ByVal ptLocat As Point)
 
        Public Sub New()
            MouseHookDelegate = New MouseProcDelegate(AddressOf MouseProc)
            MouseHookCrop = SetWindowsHookEx(WH_MOUSE_LL, MouseHookDelegate, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
        End Sub
 
        Private Function MouseProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MSLLHOOKSTRUCT) As Integer
            If (nCode = HC_ACTION) Then
                Select Case wParam
                    Case WM_LBUTTONDOWN
                        RaiseEvent Mouse_Left_Down(lParam.pt)
                    Case WM_LBUTTONUP
                        RaiseEvent Mouse_Left_Up(lParam.pt)
                End Select
            End If
            Return CallNextHookEx(MouseHookCrop, nCode, wParam, lParam)
        End Function
 
        Protected Overrides Sub Finalize()
            UnhookWindowsHookEx(MouseHookCrop)
            MyBase.Finalize()
        End Sub
    End Class
 
#End Region
 
#Region "Declare & Constant для мыши"
 
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    Public Const MOUSEEVENTF_LEFTDOWN = &H2
    Public Const MOUSEEVENTF_LEFTUP = &H4
    Private WithEvents MEvent As New MouseHookCrop
 
#End Region
 
#Region "События мыши"
 
    Private Sub MEvent_Mouse_Left_Down(ByVal ptLocat As System.Drawing.Point) Handles MEvent.Mouse_Left_Down
        Timer1.Start()
    End Sub
 
    Private Sub MEvent_Mouse_Left_Up(ByVal ptLocat As System.Drawing.Point) Handles MEvent.Mouse_Left_Up
        Timer1.Stop() 'Не хватает условия для отключения таймера
        TimeMS = 0
    End Sub
 
#End Region
 
#Region "Таймер по умолчанию (интервал = 1)"
 
    Dim TimeMS As Integer = 0
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If TimeMS = 0 Then
            'mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
            My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Beep)
        ElseIf TimeMS = 25 Then
            'mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
            My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Hand)
        ElseIf TimeMS = 50 Then
            TimeMS = 0
            Exit Sub
        End If
        TimeMS = TimeMS + 1
    End Sub
 
#End Region
 
End Class
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2018, 22:50
Ответы с готовыми решениями:

Загрузка картинок по очереди при движении мыши с зажатой левой кнопкой
При помощи HScrollBar можно самостоятельно перелистывать с разной скоростью 50 изображений, от 0 до 49 в формате .png, Private Sub...

ONMouseMove не вызывается при зажатой левой кнопке мыши
При Зажатой левой КМ не вызывается событие оnmouseMove проект ниже

Поворот объекта по оси Z при зажатой левой кнопке мыши
Здравствуйте! Подскажите, пожалуйста, в чем может быть проблема: скрипт занимается поворотом объекта, если зажата левая кнопка мыши. Тут...

2
Лень — мое второе и
 Аватар для Orlangur
3224 / 2413 / 686
Регистрация: 28.11.2014
Сообщений: 3,599
Записей в блоге: 3
28.05.2018, 12:32
Лучший ответ Сообщение было отмечено PSYGNOSIS как решение

Решение

PSYGNOSIS, а почему не использовать GetAsyncKeyState ?

Так же здесь есть что-то похожее

Если использовать GetAsyncKeyState, то можно обойтись таким кодом
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <DllImport("user32.dll")> _
    Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
    End Function
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
 
 
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If GetAsyncKeyState(Keys.LButton) Then
            Label1.Text = "Нажата"
            mouse_event(&H2, 0, 0, 0, 0)
        Else
            Label1.Text = "Пауза"
        End If
 
    End Sub
Если прикручивать к вашему варианту, то можно так
VB.NET
1
2
3
4
5
6
7
8
9
 Private Sub MEvent_Mouse_Left_Up(ByVal ptLocat As System.Drawing.Point) Handles MEvent.Mouse_Left_Up
        If GetAsyncKeyState(Keys.LButton) Then
            Label1.Text = "Нажата"
        Else
            Label1.Text = "Не нажата"
            Timer1.Stop() 'Не хватает условия для отключения таймера
            TimeMS = 0
        End If
    End Sub
2
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 3
28.05.2018, 12:46  [ТС]
Очень благодарен за ответ!
Посмотрел пока по вашей ссылке на Microsoft (GetRawInputData), сразу все стало понятно. Сам бы я это не нашел. Вечером поковыряюсь. Еще раз спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2018, 12:46
Помогаю со студенческими работами здесь

Как отловить событие перемещения курсора при зажатой левой кнопке мыши
Искал на форуме не нашел как можно реализовать такую штуку? Хочу отловить событие перемещения курсора при зажатой левой кнопке мыши. К...

Как сделать нажатие левой кнопки мыши по таймеру
Видел много программ по типу авто &quot;кликеры&quot; вот думал дай свою напишу хотел попробовать и тут на тебе сразу тупик на 1 ступени. Помогите...

При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квад
При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квадрат. При повторном...

Ограничить передвижение курсора мыши левой нижней четвертью экрана.При нажатие левой клавиши мыши выключить индикатор NumLock(+Звук),при нажатие право
Не могу решить подскожите кто знает.(Ограничить передвижение курсора мыши левой нижней четвертью экрана.При нажатие левой клавиши мыши...

Закраска DrawGrid при зажатой левой клавишей мыши
Как сделать так, чтобы зажав на DrawGrid левой клавишей мыши, началась его закраска и при перемещении мыши закрашивались другие клетки, над...


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

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

Новые блоги и статьи
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru