Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Эмуляция движений мыши в DX/OGL Добавлено: 10.03.07 23:54  

Автор вопроса:  Fever
Здр. ув. фор-не. Эмуляция перемещений мыши через API не работает в DX/OGL. Каким образом можно ее реализовать?
ps пробовал так

GetCursorPos mCur
mRnd = Int(Rnd * 151451435) Mod 64
mAng = Rnd * 6.28318
mX = mRnd * Cos(mAng)
mY = mRnd * Sin(mAng)
mCur.X = mCur.X + mX
mCur.Y = mCur.Y + mY
SetCursorPos mCur.X, mCur.Y
mouse_event 3, 0, 0, 0, 0
Sleep 1
mouse_event 4, 0, 0, 0, 0
GetCursorPos mCur
mCur.X = mCur.X - mX
mCur.Y = mCur.Y - mY
SetCursorPos mCur.X, mCur.Y
Sleep 1

Код запускается в цикле и должен создавать дрожь курсора и щелчки. Все работает так, как надо, но не в играх. Там происходят только щелчки, курсор не движется.

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #1
Добавлено: 11.03.07 03:19
Код запускается в цикле

Если я правильно понял в цикле отрисовки и мышь "блокируется"?

Ответить

Номер ответа: 2
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #2 Добавлено: 11.03.07 16:45
Не, не то.

Option Explicit

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 Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private mRunning As Boolean, mChrono As Long, mPause As Boolean, mStop As Boolean

Private Sub EndlessCycle()
    Dim mCur As POINTAPI, mRnd As Long, mAng As Single, mX As Long, mY As Long
    Do
        If mPause Then
            If GetTickCount - mChrono > 200 Then mPause = False: GoTo PauseEnded
        Else
PauseEnded:
            CheckKeyboard
        End If
        If mRunning Then
            'GetCursorPos mCur
            'mRnd = Int(Rnd * 151451435) Mod 64
            'mAng = Rnd * 6.28318
            'mX = mRnd * Cos(mAng)
            'mY = mRnd * Sin(mAng)
            'mCur.X = mCur.X + mX
            'mCur.Y = mCur.Y + mY
            'SetCursorPos mCur.X, mCur.Y
            mouse_event 1, 1, 0, 0, 0
            mouse_event 3, 0, 0, 0, 0
            Sleep 1
            mouse_event 4, 0, 0, 0, 0
            mouse_event 1, -1, 0, 0, 0
            'GetCursorPos mCur
            'mCur.X = mCur.X - mX
            'mCur.Y = mCur.Y - mY
            'SetCursorPos mCur.X, mCur.Y
            Sleep 1
        Else
            Sleep 75
        End If
        
        DoEvents
    Loop Until mStop
End Sub

Private Sub CheckKeyboard()
    If mRunning Then
        If GetAsyncKeyState(vbKeyTab) < 0 Then
            mRunning = False
            mPause = True
            mChrono = GetTickCount
        End If
    Else
        If GetAsyncKeyState(vbKeyTab) < 0 Then
            mRunning = True
            mPause = True
            mChrono = GetTickCount
        End If
    End If
End Sub

Private Sub Form_Load()
    Show
    EndlessCycle
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    mStop = True
End Sub

Ответить

Номер ответа: 3
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #3 Добавлено: 11.03.07 16:46
Закомментированый код не работает в dx

Ответить

Номер ответа: 4
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #4
Добавлено: 11.03.07 20:00
Понятно. При загрузке формы ты запускаешь цикл.
Тоже самое делает DX, при отрисовке.
Например
Private Sub Timer1_Timer()
    Render
End Sub

Бесконечный цикл отрисовки.

В функции Render (общее название) идет отрисовка сцены (BeginScene/EndScene) и переключение буферов(Present).
Реализация может и отличаться, но там где есть BeginScene/EndScene, это оно и есть.

Приоритет (и скорость обновления) DX выше, чем у GDI он будет "замазывать" эффект дрожания.

Так как мы и так имеем бесконечный цикл, попробуй вставить код в эту функцию, или вызывать EndlessCycle (естестественно без цикла) из Render'а.
Т.е. синхронизировать GDI и DX.
Качество должно получится, мягко говоря, не важное. И многое будет зависеть от "железа" и от режима рендеринга.

Лучше сделать по правильному. Но это и проще и сложнее.
Выведи картинку(средствами DX), изображающую курсор и двигай как хочешь. Это просто.
А вот с координатами, все будет несколько сложнее.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам