Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho um problema um pouco complexo, preciso fazer um programa pode ser em qualquer linguagem estou utilizando vb pq ja estou mexendo com otros projetos em vb.
Bom o programa precisa abrir outro programa, mover o cursor do mouse ate uma determinada coordenada (x,y) e realizar um procedimento como clicar e ou digitar algo.
Bom o q eu tenho no momento:
Private Sub Command1_Click()
Shell ("teste.exe"), vbMaximizedFocus
End Sub
Andei pesquisando o forum sobre rotinas com o mouse + nao consegui achar nada que pudesse me servir, se alguem tiver alguma ideia que possa me ajudar eu agradeço. Lembrando q pode ser qualquer linguagem, e so dar o caminho q eu aprendo o resto.
Cara, eu vou colocar aqui o nome de algumas funções(API do Windows) que você pode usar.
GetCursorPos
SetCursorPos
Movimenta e captura a posição do mouse.
GetWindowRect
Pega as dimenções de um objeto.
Se for de um programa externo, vai precisar saber o Handle da janela(você vai ler por ai WINDOW, entenda WINDOW como um objeto qualquer), então use
FindWindow
FindWindowEx
mouse_event
Simula o click do mouse.
Com essas funções acho que ja da para fazer. Dá uma procura no Mr. Google que você acha muita coisa sobre essas criancinhas. Mas se tiver alguma dúvida pode vir aqui e pergunta.
E isso msm eu preciso movimentar o mouse sobre o outro programa e realizar a acão de clicar ou digitar, brigado scorpio vo da uma olhada nesses comando e fazer testes.
Estou com problema o programa abre um notepad normal porem nao abre o programa q eu preciso ele da o seguinte erro.
"Load MapInfo Table Failed!"
Eu ia postar a img + nao to conseguindo hospedar no http://www.imageshack.us/
Provavelmente é um erro do programa que você quer abrir. Tenta instala de novo, verifica se o programa está com todos os arquivos.
alguem sabe q erro e esse?
por enquanto so fiz declarar a função e chamar o programa, realmente scorpion o erro anterior era do programa externo e nao do vb.
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
-------------------------------------------
Private Sub Command1_Click()
Shell ("notepad.exe"), vbMaximizedFocus
End Sub
A declaração foi feita em um módulo?
Put scorpio, eu sou iniciante em VB, nao sei nem do q você ta falando. Eu simplesmente digitei no form como ta na img abaixo, tem q fazer algo +?
Franca, então realmente a dúvida do scorpio estava certa.
Declarações com publicas só podem ser feitas dentro de modulos.
Para adicionar um module em seu programa vá até Project -> Add Module.
Todas as funções que está declarando com publicas, declare dentro do module.
Ou então você tem a opção de declará-las no form mesmo, mas ai precisa trocar de publicas (public) para privadas (private).
saquei, consegui andar com o programa, brigado ai scorpion e neto...se surgirem duvidas + pra frente eu volto a postar e no final eu posto o resultado.
Desculpe o trabalho q dei a vcs!!
=p
Magina cara, trabalho nenhum. Estamos aqui justamente para isso.
Precisando pode chamar...
Opa voltei, esta tudo funcionando, o programa abre o outro programa clica onde eu quero tudo bonitinho, so q agora eu estou estudando o SendMessage pq preciso passar um texto para um campo do outro programa, + eu nao consegui entender muito bem como q o SendMessage faz isso tipo eu declaro ele:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal Param As Any) As Long
beleza ate ai tudo bem agora como q eu vou passar a palavra para o campo q eu quero, como o SendMessage sabe exatamente qual o campo? Eu estava lendo neste site http://www.codelines.com/Portugues1/api046.htm + nao consegui entender como ele faz isso.
Use a API SetWindowText.
Ret = SetWindowText(handle,"texto")
Ou se quiser o sendmessage
Const WM_SETTEXT as long = &HC
ret = SendMessage(handle,WM_SETTEXT,0&,"texto")
Na página que você passou, ele usa a API para selecionar um item da lista.
Com essa SendMessage você pode fazer quase ou tudo que o Windows faz. POde mover, redimencionar, fechar janelas e um monte de coisas mais.
Abraços!
Vlw scorpio, + achei um modo bem simples ja q o campo texto ja sai selecionado entao eu usei o SendKeys so pra jogar o texto pra dentro do campo + concerteza eu ainda vo usar o SendMessage.
Abração!!!!!
Parece brincadeira ne + travei denovo.
Bom o q acontece e o seguinte o program serve pra automatizar uma funcao feita varias vezes no dia essa funcao consiste em abrir um program e inserir dados em certas posicoes, a questao e q qnd meu vb comeca a rodar ele abre o programa reconhece as coordenadas que deve posicionar o mouse e simula o click do mouse essa primeira etapa esta funcionado corretamente.
Depois do programa aberto eu preciso inserir um login e senha de administrador e clicar em ok, bom nessa parte e q nao funciona o q parece q q o programa tem um forma dentro da janela, ou seja você tem a janela principal do programa que ja havia sido aberta anteriromente pelo vb e dentro dessa janela você tem acredito ser um form onde tem os campos de login, senha e os botoes de ok e cancelar, eu consigo posicionar o mouse onde eu quiser nessa janela porem o comando para simular o mouse ja nao funciona. alguem tem alguma ideia do q possa ser?
O programa esta da seguinte forma:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) 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)
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Const MOUSEEVENTF_MIDDLEDOWN = &H20
Const MOUSEEVENTF_MIDDLEUP = &H40
Const MOUSEEVENTF_MOVE = &H1
Const MOUSEEVENTF_ABSOLUTE = &H8000
Const MOUSEEVENTF_RIGHTDOWN = &H8
Const MOUSEEVENTF_RIGHTUP = &H10
Private Declare Function InternetGetConnectedState Lib "wininet" (ByRef dwflags As Long, ByVal dwReserved As Long) As Long
Private Function IsWebConnected(Optional ByRef ConnType As String) As Boolean
Dim dwflags As Long
Dim WebTest As Boolean
ConnType = ""
WebTest = InternetGetConnectedState(dwflags, 0&)
Select Case WebTest
Case dwflags And CONNECT_LAN: ConnType = "LAN"
Case dwflags And CONNECT_MODEM: ConnType = "Modem"
Case dwflags And CONNECT_PROXY: ConnType = "Proxy"
Case dwflags And CONNECT_OFFLINE: ConnType = "Offline"
Case dwflags And CONNECT_CONFIGURED: ConnType = "Configurada"
Case dwflags And CONNECT_RAS: ConnType = "Remota"
End Select
IsWebConnected = WebTest
End Function
Function FU_Delay(Quanto As Double, PermiteDoEvents As Integer) As Double
Dim Inicio As Double
Dim Check As Double
Dim Contador As Double
Contador = Timer
Inicio = Timer
Do Until Check >= (Inicio + Quanto)
Check = Timer
If PermiteDoEvents Then DoEvents
Loop
FU_Delay = (Timer - Contador)
End Function
Private Sub Form_Load()
Dim pos As RECT
Dim altura, largura As Double
Dim x, y As Single
Dim posicao As POINTAPI
Dim msg As String
If IsWebConnected(msg) Then 'funcao q verifica se o programa esta conectado
Shell ("teste.exe"), vbNormalFocus 'abre o programa
vPausa = FU_Delay(2, False)
hwnd_inicial = FindWindow(vbNullString, "nome da janela")
Debug.Print hwnd_inicial
If hwnd_inicial <> 0 Then
teste = GetWindowRect(hwnd_inicial, pos)
altura = pos.Bottom
largura = pos.Right
Debug.Print altura
Debug.Print largura
GetCursorPos posicao
Debug.Print "Current X = " & posicao.x
Debug.Print "Current y = " & posicao.y
SetCursorPos 912, 740 'posiciona o mouse no botao ok
vPausa = FU_Delay(4, False)
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0&, 0&, cButt, dwEI 'clica no botao ok
vPausa = FU_Delay(4, False)
SetCursorPos 912, 740 'posiciona o mouse no campo de login
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0&, 0&, cButt, dwEI 'clica no campo de login
Sendkeys "login" 'digita o login
Else
MsgBox "Erro ao Abrir o Programa"
End If
Else
msg = "Programa nao conectado"
MsgBox msg, vbOKOnly, "Estado de conexão à Internet"
End If
End Sub
Apartir da parte em vermelho ele nao consegue + executar os comandos, uma duvida o nome da janela no FindWindow e o nome q aparece la me cima no cabecalho ne?
Não entendi. Esse programa tem forms MDI(uma janela dentro da outra)?
FindWindow, sim é o que aparece lá em cima.
Abraços!
Vou exemplificar com forms do VB, o programa que eu chamo e + - asim que ele abre.
1- Ele abre uma tela so pra iniciar o programa, como se fosse um botao so pra entrar no programa ate essa parte eu consigo de boa posicionar o mouse e clicar no botao iniciar.
2- Qnd o progrma abre realmente, ele abre da forma abaixo o nome da janela princiapal permanece + tem tipo uma janela menor dentro do programa para inserir login e senha para autenticar o usuario do programa, nesta parte eu conisgo posicionar o mouse onde eu quiser porem nao consigo usar os comandos de simular o clikc do mouse ou de mandar o login e senha atraves do sendkeys
Obs: Essa outra janela menor nao e em cima do programa principal ela e dentro do programa principal, o nome da janela principal(maior) permanece igual o tempo inteiro ela nao muda em momento algum.
Essa tela que abre dentro, vem com alguma caixa de texto selecionada? (com o foco?)
Se sim, pode tentar usar a API GetFocus para pegar o HANDLE do objeto, e dai colocar loginn/senha.
Abraços!
Você precisa mover o mouse sobre o outro programa ou sobre o seu?
Se for sobre o seu, você quer que ele se mova sozinho até a coordenada e faça o evento?