Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176

Запись в файл кликов мыши. Обратная операция

25.12.2011, 22:22. Показов 2740. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, как изменить этот код так чтобы он еще и клики записывал в текстовой документ и воспроизводил их?
Visual Basic
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
Option Explicit
Private Declare Function CreateSemaphore Lib "kernel32" Alias "CreateSemaphoreA" (ByVal lpSemaphoreAttributes As Long, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Type POINTAPI
        x As Long
        y As Long
End Type
Private Const ERROR_ALREADY_EXISTS = 183&
Dim z As POINTAPI
Dim fFile
 
Private Sub cmdplay_Click()
    fFile = FreeFile
    Open Text1.Text For Input As fFile
    tmrPlay.Interval = 1
End Sub
 
Private Sub cmdRecord_Click(Index As Integer)
On Error Resume Next
    Kill Text1.Text
    tmrRecord.Interval = 1
End Sub
 
Private Sub Stop_Click()
    tmrRecord.Interval = 0
    tmrPlay.Interval = 0
End Sub
 
Private Sub tmrPlay_Timer()
Dim strPos As String
Dim cv_X As Long
Dim cv_Y As Long
 
If EOF(fFile) = False Then
    Line Input #fFile, strPos
    cv_X = CLng(Trim(Mid(strPos, 4, InStr(1, strPos, "Y:") - 4)))
    cv_Y = CLng(Trim(Mid(strPos, InStr(1, strPos, "Y:") + 3, Len(strPos) - (InStr(1, strPos, "Y:") + 2))))
    SetCursorPos сv_X, сv_Y
 
Else
    Close fFile
    tmrPlay.Interval = 0
End If
End Sub
 
Private Sub tmrRecord_Timer()
    Dim pos As POINTAPI
    Dim frFile
    frFile = FreeFile
    GetCursorPos pos
    Open Text1.Text For Append As frFile
        Print #frFile, "X: " & Trim(Str(pos.x)) & " Y: " & Trim(Str(pos.y))
    Close frFile
End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2011, 22:22
Ответы с готовыми решениями:

Сохранение данных из List<> в файл и обратная операция
Я записал в файл информацию с помощью List&lt;&gt; Мне надо из файла, информацию, которую я записал, вывести опять в List&lt;&gt;, который...

Timer, GetCursorPos и запись в файл нескольких кликов вместо одного
В таймере считываю координаты мышы, после чего записываю их в файл Private Sub Timer1_Timer() Dim ButMous As String PosCur =...

Чтение нескольких строк из файла, выполнение над ними операций и обратная запись в файл
В файле есть несколько строк, например: 1) 2+3; 2) 4/2; 3) 5*6. Программа должна считать эти строки из файла и посчитать эти значения....

14
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
27.12.2011, 01:58
Интересная задача, и вот что получилось

Visual Basic
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
Option Explicit
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, _
ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
 
Private Type POINTAPI
        x As Long
        y As Long
End Type
 
Const KEYEVENTF_KEYUP = &H2
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Const MOUSEEVENTF_MOVE = &H1
Const MOUSEEVENTF_ABSOLUTE = &H8000
 
Dim coord(10000) As POINTAPI
Dim State(10000) As Integer
Dim n, i, OldLMBState
 
Private Sub Form_Load()
Timer1.Enabled = False
Timer2.Enabled = False
max = 1000 'кол-во кадров
End Sub
 
'запись 
Private Sub Command1_Click()
n = 0
Timer1.Interval = 10
Timer1.Enabled = True
End Sub
 
'воспроизведение
i = 0
Timer2.Interval = 10
Timer2.Enabled = True
End Sub
 
Private Sub Timer1_Timer()
Dim LMBState
GetCursorPos coord(n)
LMBState = GetAsyncKeyState(1)
 
State(n) = 0
If LMBState < 0 And OldLMBState = 0 Then State(n) = 1 'нажал
If LMBState = 0 And OldLMBState < 0 Then State(n) = -1 'отпустил
OldLMBState = LMBState
n = n + 1
 
If n >= max Then
    Timer1.Enabled = False
    State(n - 1) = -1 'отпустить в конце чтоб не залипло
    MsgBox "record end"
End If
End Sub
 
Private Sub Timer2_Timer()
'SetCursorPos coord(i).x, coord(i).y ' этот метод проще)
Call mouse_event(MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE, _
coord(i).x * (65535 / Screen.Width * Screen.TwipsPerPixelX), _
coord(i).y * (65535 / Screen.Height * Screen.TwipsPerPixelY), 0, 0)
 
If State(i) = 1 Then Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 
If State(i) = -1 Then Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 
i = i + 1
 
If i >= max Then
    Timer2.Enabled = False
    MsgBox "play end"
End If
End Sub
запись в файл уж сам допиши, а то спать охота
1
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
27.12.2011, 21:32  [ТС]
Мышка все равно залипает после воспроизведения, как исправить?
Visual Basic
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
Option Explicit
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, _
ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
 
Private Type POINTAPI
        x As Long
        y As Long
End Type
 
Const KEYEVENTF_KEYUP = &H2
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Const MOUSEEVENTF_MOVE = &H1
Const MOUSEEVENTF_ABSOLUTE = &H8000
 
Dim coord(10000) As POINTAPI
Dim State(10000) As Integer
Dim n, i, OldLMBState, Max
 
Private Sub Command3_Click()
Timer1.Enabled = False
Timer2.Enabled = False
Timer1.Interval = 0
Timer2.Interval = 0
End Sub
 
Private Sub Form_Load()
Timer1.Enabled = False
Timer2.Enabled = False
Max = 1000 'кол-во кадров
End Sub
 
'запись
Private Sub Command1_Click()
n = 0
Timer1.Interval = 10
Timer1.Enabled = True
End Sub
 
'воспроизведение
Private Sub Command2_Click()
i = 0
Timer2.Interval = 10
Timer2.Enabled = True
End Sub
 
Private Sub Timer1_Timer()
Dim LMBState
GetCursorPos coord(n)
LMBState = GetAsyncKeyState(1)
 
State(n) = 0
If LMBState < 0 And OldLMBState = 0 Then State(n) = 1 'нажал
If LMBState = 0 And OldLMBState < 0 Then State(n) = -1 'отпустил
OldLMBState = LMBState
n = n + 1
 
If n >= Max Then
    Timer1.Enabled = False
    State(n - 1) = -1 'отпустить в конце чтоб не залипло
    MsgBox "record end"
End If
End Sub
 
Private Sub Timer2_Timer()
'SetCursorPos coord(i).x, coord(i).y ' этот метод проще)
Call mouse_event(MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE, _
coord(i).x * (65535 / Screen.Width * Screen.TwipsPerPixelX), _
coord(i).y * (65535 / Screen.Height * Screen.TwipsPerPixelY), 0, 0)
 
If State(i) = 1 Then Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
If State(i) = -1 Then Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
i = i + 1
 
If i >= Max Then
    Timer2.Enabled = False
    MsgBox "play end"
End If
End Sub
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
27.12.2011, 21:38
добавить после 80
Visual Basic
1
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
или

убрать равенство из условий, оставить If n > Max Then и If i > Max Then

или

65
Visual Basic
1
 State(n) = -1 'отпустить в конце чтоб не залипло
Но первый вариант вернее
1
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
27.12.2011, 21:43  [ТС]
Она перемещается в координаты 0, 0 и зависает там, до закрытия программы.
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
27.12.2011, 21:51
Ну сначала надо записать движения мыши, а только потом воспроизводить.
1
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
27.12.2011, 22:00  [ТС]
Я сделал 3 кнопку (стоп) жму записать (записываю движения) жму стоп, воспроизвожу - она повторяет все движения в конце жмет на 3 кнопку (стоп), и улетает в положение 0, 0.
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
27.12.2011, 22:14
А стоп что делает? Останавливает запись?
Ну так правильно, воспроизведение пойдет до 1000 кадра, а они пустые, вот и уходит в 0

Visual Basic
1
2
3
4
5
'stop
Timer1.Enabled = False
State(n) = -1 'отпустить в конце чтоб не залипло
max = n 'или n-1 проверь
MsgBox "record end"
1
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
27.12.2011, 22:19  [ТС]
Спасибо, теперь все работает.

Добавлено через 1 минуту
Я только вот не могу вообще сделать так, чтобы все это (клики, координаты) - записывались в файл.
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
27.12.2011, 22:31
Записываешь строки
Visual Basic
1
Print #frFile, coord(i).x & vbtab & coord(i).y & vbtab & state(i)
И потом читаешь построчно разделяя на части:
Visual Basic
1
2
3
4
5
6
7
8
9
i=0
do while not (EOF(1))
    t1=instr(1,str,vbtab)
    t2=instr(t1+1,str,vbtab)
    coord(i).x = cint(mid(str,1,t1-1))
    coord(i).y = cint(mid(str,t1+1,t2-t1-1))
    state(i)= cint(mid(str,t2+1,2))
    i=i+1
loop
как то так
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
27.12.2011, 22:57  [ТС]
Я что то тут намутил, но не чего не работает)).
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Command4_Click()
    Dim coord(n) As POINTAPI
    Dim frFile
    frFile = FreeFile
    GetCursorPos coord(n)
    'Открыть файл (txt1 - это текстовое поле)
    Open txt1 For Append As frFile
       'Запись в файл.
        Print #frFile, coord(i).x & vbTab & coord(i).y & vbTab & State(i)
       'Закрыть файл
    Close frFile
End Sub
Он не работает 2 строка n не известное значение, а он этого не понимает).
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
27.12.2011, 23:02
Visual Basic
1
 Dim coord(n) As POINTAPI
объявлено глобально в начале,зачем здесь?
и запись в цикле
Visual Basic
1
2
3
for i = 0 to max
    Print #frFile, coord(i).x & vbTab & coord(i).y & vbTab & State(i)
next
1
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
27.12.2011, 23:09  [ТС]
Так теперь я наблюдаю следующую картину когда открываю текстовой документ:
346 267 0
0 0 0
0 0 0
0 0 0
0 0 0
И т.д. продолжаются нули, и с 1000+ строки еще одно:
388 256 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
И т.д.
0
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
28.12.2011, 02:09
Смотри
Вложения
Тип файла: rar timer для мыши.rar (3.6 Кб, 46 просмотров)
1
Эксперт Hardware
 Аватар для Linoge
3205 / 1915 / 324
Регистрация: 25.10.2011
Сообщений: 5,564
09.06.2012, 09:00
Поправленный вариант.
Вложения
Тип файла: rar timer для мыши.rar (10.7 Кб, 69 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2012, 09:00
Помогаю со студенческими работами здесь

Операция, обратная (int)char
Подскажите пожалуйста операцию, обратную (int)char

Операция обратная Encoding.GetBytes()
string str = &quot;21&quot;; byte send2 = Encoding.ASCII.GetBytes(str); Console.Write(send2); Выводит &quot;49&quot;. Как из этого обратно получить...

Хеширование строки и обратная операция
Добрый день! Есть строка, состоящая из слов и цифр. Мне нужно получить зашифрованную строку, которую потом можно преобразовать обратно...

Существует ли операция, обратная побитовму И (AND)
Подскажите, существует ли операция, обратная побитовму И (AND). Например: 9000 &amp; 255 = 40 Тоже самое, только в двоичной записи : ...

Эмуляция кликов мыши
Ребята, помогите написать простой макрос в VBA, встроенном в экселе. Необходимо следующее: при запуске макроса (Макрос1 пускай будет...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru