Usando o Método SendKeys do Objeto WScript.Shell

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por asimoes »

Pode ser útil em uma janela GUI, fiz um teste com com campo get entrou 123.

* Funciona em uma janela GUI fiz um teste.

Código: Selecionar todos

   objShell := Win_OleCreateObject("WScript.Shell")
   objShell:SendKeys("123")
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por asimoes »

Simulando uma soma na Calculadora

Código: Selecionar todos

   objShell := Win_OleCreateObject("WScript.Shell")
   objShell:Run("calc")
   Inkey(1)
   objShell:AppActivate("Calculator")
   Inkey(1)
   objShell:SendKeys("1{+}")
   Inkey(1)
   objShell:SendKeys("2")
   Inkey(1)
   objShell:SendKeys("~") // Total
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por JoséQuintas »

Talvez mais interessante usar a API PostMessage(), e eventos WM_KEYDOWN e WM_KEYUP.
Como devem pedir exemplo, vai um dos meus tempos de VB.

Código: Selecionar todos

Option Explicit

' API_SendKey
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" _
   (ByVal hwnd As Long, ByVal wMsg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long

' API_SendKey
Const WM_KEYDOWN = &H100
Const WM_KEYUP = &H101

Public Sub Api_SendKey(hwnd As Long, nKey As Long)

Dim lRetVal As Long
lRetVal = PostMessage(hwnd, WM_KEYDOWN, nKey, 0)
lRetVal = PostMessage(hwnd, WM_KEYUP, nKey, 0)
End Sub
Isso foi na entrada de uma versão de Windows, não lembro se Windows 7, onde a SendKeys do VB6 era bloqueada pela segurança, então a alternativa que encontrei na época foi essa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por JoséQuintas »

Equivalente em Harbour 3.4:

Código: Selecionar todos

wapi_PostMessage( hWnd, WM_KEYDOWN, nKey, 0 )
wapi_PostMessage( hWnd, WM_KEYUP, nKey, 0 )
Nota: Pelo nome das rotinas, deve ser apertar tecla e soltar tecla.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por asimoes »

Até poderia ser, mas o exemplo tá usando algo que já está disponível no harbour que é Win_OleCreateObject, existem muitos exemplos usando objeto, é somente uma outra visão do que se pode fazer.

Não sei com wapi_* como funcionaria o meu exemplo
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por JoséQuintas »

Pois é... não deu, pelo menos no W10.
Não sei se ASCII é o mesmo que teclado, ou se é outro problema.

Código: Selecionar todos

REQUEST HB_CODEPAGE_PTISO

PROCEDURE Main

   LOCAL hWnd

    SetMode( 25, 80 )
    CLS
    hWnd := wapi_FindWindow( ,"calculadora" )
    WinKeyboard( hWnd, "1+2=" )

    Inkey(0)

    RETURN

FUNCTION WinKeyboard( hWnd, cText )

   LOCAL oElement

   FOR EACH oElement IN cText
      wapi_PostMessage( hWnd, WM_KEYDOWN, Asc( oElement ), 0 )
      wapi_PostMessage( hWnd, WM_KEYUP, Asc( oElement ), 0 )
   NEXT

   RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por asimoes »

Quintas,

O meu teste foi no W10
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por asimoes »

Quintas,

Você tem que dar um tempo entre uma operação e outra para a janela aceitar o comando se não não vai funcionar veja pelo meu exemplo, baseado num exemplo da microsoft, outra coisa, você tem que dar foco na janela. ( aqui estou na duvida )
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por JoséQuintas »

asimoes escreveu:outra coisa, você tem que dar foco na janela. ( aqui estou na duvida )
Isso não.

hWND := wapi_FindWindow( ... )
PostMessage( hWND ... )

hWnd é justamente a indicação da janela, e não do programa.
wapi_FindWindow, como o próprio nome diz: encontrar a janela

Antes daquele post também tentei com pausa entre as mensagens e não foi.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por asimoes »

O windows é meio selvagem (rs) tem saber domar o bicho
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por asimoes »

Outras possibilidades

Maximizar, minimizar ou restaurar uma janela externa por exemplo o Firefox

Código: Selecionar todos

objShell := Win_OleCreateObject("WScript.Shell")
objShell:AppActivate("Firefox")
//objShell:SendKeys("% x") // Maximizar a janela ativa
//objShell:SendKeys("% n") // Minimizar a janela ativa
objShell:SendKeys("% r") // Restaurar a janela ativa
Inkey(1)
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por cjp »

Outras possibilidades

Maximizar, minimizar ou restaurar uma janela externa por exemplo o Firefox
Estou testando estas opções.

A única coisa que consegui fazer foi trazer pra frente a janela pretendida. Mas não estão funcionando as opções de minimizar (que é a que eu preciso), nem de maximizar.

Estou usando HB 3.2, de 64 bits, em modo console, com windows 10.
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por alxsts »

Olá!

Poste o código...
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Usando o Método SendKeys do Objeto WScript.Shell

Mensagem por cjp »

Código: Selecionar todos

objShell := Win_OleCreateObject("WScript.Shell")
objShell:AppActivate("ag5plano")
?"Vai maximizar:"
inkey(3)
objShell:SendKeys("% x") // Maximizar a janela ativa
?"Maximizou?"
?"Vai minimizar:"
inkey(3)
objShell:SendKeys("% n") // Minimizar a janela ativa
?"Minimizou?"
inkey(3)
?"Vai restaurar:"
inkey(3)
objShell:SendKeys("% r") // Restaurar a janela ativa
?"Restaurou?"
Inkey(3)		 
Fiz apenas para testar.
Inacio de Carvalho Neto
Responder