Usuário com melhor resposta
OBTENDO DADOS DA TELA DE UM OUTRO PROGRAMA

Pergunta
-
Pessoal, Boa Noite!
Estou idealizando uma solução para um cliente que consiste em automatizar a atualização do campo situação de registros do banco de dados dele.
A informação de situação está em um banco de dados em um ambiente externo na receita federal e portanto é inacessível sem se utilizar um emulador, que é uma caixa preta.
No ambiente do cliente estão instalados alguns sistema feitos em VB6/Windows Form.
A idéia é criar um robozinho, como é feito no caso do SISBACEN, para:
1 - Abrir o sistema VB6
2 - Abrir uma tela de pesquisa
3 - Colar no campo chave o ID do registro que eu quero buscar
4 - Abrir o registro retornado
5 - Ir no campo situação (label) e copiar o texto referente a situação do registro
6 - Salvar esta informação no banco de dados em campo específico conforme a chave do registro.
Então, neste cenário entenda-se:
1 - Existirá um novo sistema comandando o aplicativo VB6 terceirizado que nãoi temos acesso aos fontes e nem ao Banco de Dados
2 - Existirá um novo aplicativo desenvolvido pela minha empresa
3 - Existirá um Banco de Dados FireBird que está atrelado ao sistema legado do cliente, que também é uma caixa preta já que é um sistema de uma outra empresa.
4 - Tenho acesso às tabelas deste sistema legado citado no item 3
Enfim, achei umas referências interssantes aqui mesmo no forum: http://social.msdn.microsoft.com/forums/pt-BR/vsvbasicpt/thread/f4f083d3-bd98-40df-8d7e-99f061e3d47e
Mas gostaria de mais informações e possibilidades de se resolver um problema como este?
Alguém ai já fez um robozinho em vb.net como o robo idealizado para capturar as telas do sisbacen?
No aguardo,
Lincoln Sposito
Atenciosamente, Lincoln Sposito TEL COM. 55 11 3337-0944 / TEL CEL. 55 11 9182-8571 / EMAIL: LINCOLN@SPTRES.COM / skype: lincoln.sposito / www.sptres.com
Respostas
-
Para isso você deve usar as apis do Windows. Uma das mais usadas para isso é a SendMessage, Gettext, etc. Abaixo segue alguns links com os exemplos para controlar a calculadora do windows, aí é só ir ajustando para o que você quer.
http://forums.mrplc.com/index.php?app=downloads&showfile=816
http://www.codeproject.com/KB/system/hooksys.aspx
http://www.devasp.net/net/articles/display/690.html
Bruno Ferreira de Souza
MSP - Microsoft Student Partner
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 19 de agosto de 2011 17:20
- Marcado como Resposta LINCOLN SPOSITO sexta-feira, 9 de setembro de 2011 22:44
- Não Marcado como Resposta LINCOLN SPOSITO sexta-feira, 16 de setembro de 2011 23:16
- Marcado como Resposta AndreAlvesLimaModerator quarta-feira, 28 de dezembro de 2011 18:07
-
No passo 2, tenta atribuir uma tecla de atalho para esse menu, e se ele tiver você da o sendkeys com essa tecla.
Bruno Ferreira de Souza
MSP - Microsoft Student Partner
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
MCC - Microsoft Community Contributor
www.maestrodotnet.com.br
@BrunoMaestro- Marcado como Resposta AndreAlvesLimaModerator quarta-feira, 28 de dezembro de 2011 18:07
Todas as Respostas
-
Para isso você deve usar as apis do Windows. Uma das mais usadas para isso é a SendMessage, Gettext, etc. Abaixo segue alguns links com os exemplos para controlar a calculadora do windows, aí é só ir ajustando para o que você quer.
http://forums.mrplc.com/index.php?app=downloads&showfile=816
http://www.codeproject.com/KB/system/hooksys.aspx
http://www.devasp.net/net/articles/display/690.html
Bruno Ferreira de Souza
MSP - Microsoft Student Partner
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 19 de agosto de 2011 17:20
- Marcado como Resposta LINCOLN SPOSITO sexta-feira, 9 de setembro de 2011 22:44
- Não Marcado como Resposta LINCOLN SPOSITO sexta-feira, 16 de setembro de 2011 23:16
- Marcado como Resposta AndreAlvesLimaModerator quarta-feira, 28 de dezembro de 2011 18:07
-
Amigos estou trabalhando neste desenvolvimento e estou usando algumas apis do windows.
No entanto, estou meio perdido.
Na minha lógica, os seguintes passos devem ser executados:
PASSO: 1 - Abrir o aplicativo ABC.EXE e obter o handle da janela principal.
Para este item estou usando a API FindWindows da seguinte maneira:
Dim lpszParentClass As String =
"ABC.EXE"
Dim lpszParentWindow As String =
"ABC"
Dim ParenthWnd As New IntPtr
(0)
ParenthWnd = FindWindow(vbNullString, lpszParentWindow)
If ParenthWnd.Equals(IntPtr.Zero) Then Return Else IniciaEnum(ParenthWnd)
Funcionou corretamente.
PASSO 2: ABRIR UMA SUB-JANELA DO APLICATIVO ABS, ATRA´VÉS DO MENU CONSULTAR
Não sei como fazer corretamente este item e estou indo por tentativa e erro.
No caso, estou tentando obter a classe do menu Consultar através da api GetClassName, a partir dela estou tentando chamar a sub-janela de consulta para continuar o trabalho.
Enfim, nesta ettapa o meu objetivo é abrir um form (Form Child) de consulta dentro do aplicativo VB6.
Qual seria a melhor forma de fazer isto?
PASSO 3: DENTRO DO FORM CONSULTAR NECESSITO COLOCAR UM VALOR DENTRO DO CAMPO DE PESQUISA
Entendo que o processo deva ser realizado através das apis GetClassName e SendMessage.
Mas também não estou entendendo o uso das mesmas.
No caso, usei um código parecido com este:
"
Public
Function EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As
Boolean
Dim tam As
Long
Dim tamAux As
Integer
Dim bufAux As String
= Space(255)
Dim bufCopia As
String
Dim bufTitle As
String
Dim bufClassName As
String
' Obtém o tamanho do texto da janela.
tam = SendMessage(hWnd, WM_GETTEXTLENGTH, 0&, 0&)
' Verifica se o tamanho do texto retornado é maior que 0.
If tam > 0
Then
' Nome da classe.
tamAux = GetClassName(hWnd, bufAux, 255)
tamAux = InStr(1, bufAux, Chr(0))
bufClassName = Left$(bufAux, tamAux - 1)
' Verifica o nome do controle no Delphi.
If bufClassName = "TEdit"
Then
' Edit1
' Título da janela.
tamAux = GetWindowText(hWnd, bufAux, 255)
tamAux = InStr(1, bufAux, Chr(0))
bufTitle = Left$(bufAux, tamAux - 1)
' Copia texto de Edit1 para Text1 no aplicativo VB.
If bufTitle = "Edit1"
Then
Debug
.Print(CopiaTexto(hWnd))
' Copia texto de Edit2 para Text2 no aplicativo VB.
ElseIf bufTitle = "Edit2"
Then
' Edit2
Debug
.Print(CopiaTexto(hWnd))
End
If
End
If
End
If
' Continua o loop até passar por todas as janelas internas.
EnumChildProc =
True
End
Function
"
Não obtenho sucesso pois a chamada do GetClassName não me retorna nada.
PASSO 4: EXECUTAR A CONSULTA ATRAVÉS DO CLIQUE NO BOTÃO OK
Acredito que este passo deva ser realizado através da api SendMessage.
Mas não tenho certeza.
Realizando estes passos acredito ter condições de dar andamento nos demais passos para a conclusão do fluxo do sistema.
Alguém poderia me dar um help?
Abs,
Lincoln
Atenciosamente, Lincoln Sposito TEL COM. 55 11 3337-0944 / TEL CEL. 55 11 9182-8571 / EMAIL: LINCOLN@SPTRES.COM / skype: lincoln.sposito / www.sptres.com -
No passo 2, tenta atribuir uma tecla de atalho para esse menu, e se ele tiver você da o sendkeys com essa tecla.
Bruno Ferreira de Souza
MSP - Microsoft Student Partner
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
MCC - Microsoft Community Contributor
www.maestrodotnet.com.br
@BrunoMaestro- Marcado como Resposta AndreAlvesLimaModerator quarta-feira, 28 de dezembro de 2011 18:07