Ir para o conteúdo
Leudassdf

Problema com ciclo for

Mensagens Recomendadas

Leudassdf

Boas pessoal eu tenho um modulo onde tenho uma API(sendinput()) de maneira a clicar em coordenadas. Abaixo o código do modulo:

Imports System.Runtime.InteropServices
Module modulo1
<DllImport("user32.dll", SetLastError:=True)> _
Private Function SendInput( _
			ByVal cInputs As Integer, _
			ByRef pInputs As INPUT, _
			ByVal cbSize As Integer) As Integer
End Function
Public contagem As Integer = 0
Const INPUT_MOUSE = 0
' Flattened - nested structures are problematic...
Private Structure INPUT
	Public dwType As Integer			' starts at 0  
	Public Mousedx As Integer		   ' 4
	Public Mousedy As Integer		   ' 8
	Public MousemouseData As Integer	' 12
	Public MousedwFlags As Integer	  ' 16
	Public Mousetime As Integer		 ' 20
	Public MousedwExtraInfo As IntPtr   ' 24 - 28
End Structure
' These had no type and so were objects!!
Public Const MOUSEEVENTF_LEFTDOWN As Integer = &H2
Public Const MOUSEEVENTF_LEFTUP As Integer = &H4
Const MOUSEEVENTF_MIDDLEDOWN As Integer = &H20
Const MOUSEEVENTF_MIDDLEUP As Integer = &H40
Const MOUSEEVENTF_MOVE As Integer = &H1
Const MOUSEEVENTF_ABSOLUTE As Integer = &H8000
Const MOUSEEVENTF_RIGHTDOWN As Integer = &H8
Const MOUSEEVENTF_RIGHTUP As Integer = &H10

Sub ClickMouse(ByVal MouseButton As Integer)
	Dim inputevents As New INPUT
	inputevents.Mousedx = 0
	inputevents.Mousedy = 0
	inputevents.MousemouseData = 0
	inputevents.MousedwFlags = MouseButton
	inputevents.Mousetime = 0
	inputevents.dwType = INPUT_MOUSE
	Dim cbSize As Integer = Marshal.SizeOf(GetType(INPUT))
	Dim result As Integer = SendInput(1, inputevents, cbSize)
	Debug.WriteLine("Result: " & result)
	Dim lasterror As Integer = Marshal.GetLastWin32Error
	Debug.WriteLine("LastError: " & lasterror)
	'While result <> 1
	'	ClickMouse(MOUSEEVENTF_LEFTDOWN) 'press left button
	'	ClickMouse(MOUSEEVENTF_LEFTUP) '
	'End While

End Sub
End Module

Depois quando clico num botao eu faço um ciclo for clicar 20 vezes nas coordenadas definidas.

No entanto a primeira vez que executo o ciclo for 20 vezes ele faz os vinte cliques, nas proximas vezes que chamo o mesmo ciclo, através do teste22() nao sao efetuados os tais 20 cliques mas menos. Nao consigo perceber o porque. Alguem pode ajudar? Abaixo o codigo do Button1.click:

Private Sub teste22() Handles Button4.Click
	contagem = 0
	For i = 1 To 20
		nextz()
		Threading.Thread.Sleep(100)
	Next

End Sub
Private Sub nextz()
	'  For i = 1 To 20
	contagem += 1
	Dim newMousePosition As New System.Drawing.Point
	newMousePosition.X = 796
	newMousePosition.Y = 421
	System.Windows.Forms.Cursor.Position = newMousePosition
	Windows.Forms.Application.DoEvents()
	' Threading.Thread.Sleep(100)
	ClickMouse(CInt(MOUSEEVENTF_LEFTDOWN)) 'press left button
	ClickMouse(CInt(MOUSEEVENTF_LEFTUP))
	'Threading.Thread.Sleep(100)
	'' Next
	'Threading.Thread.Sleep(50)
	''For i = 1 To 20
	'' Dim newMousePosition As New System.Drawing.Point
	'newMousePosition.X = 731
	'newMousePosition.Y = 461
	'System.Windows.Forms.Cursor.Position = newMousePosition
	'Windows.Forms.Application.DoEvents()
	''Threading.Thread.Sleep(100)
	'ClickMouse(CInt(MOUSEEVENTF_LEFTDOWN)) 'press left button
	'ClickMouse(CInt(MOUSEEVENTF_LEFTUP)) 'release left button
	'Threading.Thread.Sleep(100)
	' Next
	If contagem = 20 Then
		Threading.Thread.Sleep(1000)
		Cursor.Position = New Point(185, 412)
		mouse_event(&H2, 0, 0, 0, 0)
		mouse_event(&H4, 0, 0, 0, 0)
		contagem = 0
		teste22()
	End If
End Sub

Penso que o problema está quando chamo teste22() pois se eu alterar para button4.performclick ele funciona na perfeiçao. No entanto esta situação nao é viavel. Alguem sabe como resolver?

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

boas

só para testar, coloca a variavel i a 1 antes do ciclo for.

i = 1

Isso não vai resolver nada. É, aliás, uma redundância. :)

nas proximas vezes que chamo o mesmo ciclo, através do teste22() nao sao efetuados os tais 20 cliques mas menos.

Exactamente quantas vezes? 19? 18? 10? Varia?

Penso que o problema está quando chamo teste22() pois se eu alterar para button4.performclick ele funciona na perfeiçao. No entanto esta situação nao é viavel. Alguem sabe como resolver?

Também acho que esse é o problema, mas não me ocorrem soluções, teria de testar.

Aliás, estás a fazer uma chamada cíclica infinita. Afinal quando é suposto terminar? Quando atingires o limite do Windows?


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leudassdf

Isso não vai resolver nada. É, aliás, uma redundância. :)

Exactamente quantas vezes? 19? 18? 10? Varia?

Também acho que esse é o problema, mas não me ocorrem soluções, teria de testar.

Aliás, estás a fazer uma chamada cíclica infinita. Afinal quando é suposto terminar? Quando atingires o limite do Windows?

É para acabar quando o utilizador faz uma combinaçao de teclas

Cumprimento

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.