Код запускается в цикле и должен создавать дрожь курсора и щелчки. Все работает так, как надо, но не в играх. Там происходят только щелчки, курсор не движется.
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
Понятно. При загрузке формы ты запускаешь цикл.
Тоже самое делает DX, при отрисовке.
Например
Private Sub Timer1_Timer()
Render
End Sub
Бесконечный цикл отрисовки.
В функции Render (общее название) идет отрисовка сцены (BeginScene/EndScene) и переключение буферов(Present).
Реализация может и отличаться, но там где есть BeginScene/EndScene, это оно и есть.
Приоритет (и скорость обновления) DX выше, чем у GDI он будет "замазывать" эффект дрожания.
Так как мы и так имеем бесконечный цикл, попробуй вставить код в эту функцию, или вызывать EndlessCycle (естестественно без цикла) из Render'а.
Т.е. синхронизировать GDI и DX.
Качество должно получится, мягко говоря, не важное. И многое будет зависеть от "железа" и от режима рендеринга.
Лучше сделать по правильному. Но это и проще и сложнее.
Выведи картинку(средствами DX), изображающую курсор и двигай как хочешь. Это просто.
А вот с координатами, все будет несколько сложнее.