Chamando API SendKey pelo Harbour

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

Moderador: Moderadores

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

Chamando API SendKey pelo Harbour

Mensagem por JoséQuintas »

Estou tentando mas não está funcionando.
Peguei este código do VB6 (mais fácil pra mim entender o tipo de parâmetro, ou se precisa ser por referência)

Código: Selecionar todos

Const WM_KEYDOWN = &H100
Const WM_KEYUP = &H101

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

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
E converti pra Harbour, mas não está funcionando.
Uso o mesmo esquema pra várias APIs e dá certo, mas nessa não.
A FindWindow encontra a janela do notepad, mas não faz o "keyboard"

Código: Selecionar todos

#include "hbdyn.ch"

PROCEDURE Main
   LOCAL hWnd, cTexto := "PINDAMONHANGABA", nAscii

   CLS
   hWnd := WindowsApi_FindWindow( "Untitled - Notepad" )
   ? hWnd
   IF hWnd > 0
      FOR nCont = 1 TO Len( cTexto )
         nAscii := Asc( Substr( cTexto, nCont, 1 ) )
         WindowsApi_SendKey( hWnd, nAscii )
      NEXT
   ENDIF
   RETURN NIL

#define WM_KEYDOWN 256
#define WM_KEYUP   257

FUNCTION WindowsApi_SendKey( hWnd, nKey )
   LOCAL nRetVal
   nRetVal := CallWindowsApi( "PostMessageA", "user32.dll", hWnd, WM_KEYDOWN, nKey, 0 )
   nRetVal := CallWindowsApi( "PostMessageA", "user32.dll", hWnd, WM_KEYUP, nKey, 0 )
   RETURN NIL

FUNCTION WindowsApi_FindWindow( cWindowName )
   LOCAL hWnd
   hWnd := CallWindowsApi( "FindWindowA", "user32.dll", NIL, cWindowName )
   IF hWnd == NIL
      hWnd := -1
   ENDIF
   RETURN hWnd

STATIC FUNCTION CallWindowsAPI( cFunctionName, cLib, ... )
   LOCAL hHandleDll, nVar
   hHandleDll := hb_LibLoad( cLib )
   nVar := hb_DynCall( { cFunctionName, hHandleDll, HB_DYN_CALLCONV_STDCALL }, ... )
   hb_LibFree( hHandleDll )
   RETURN nVar



Alguma idéia?

Obs. No VB6 byval significa que é por valor pois o default é por referência, Long é variável numérica (inteiro longo pra ser mais exato), Os hexadecimais conferi no próprio VB6 estilo Clipper: ? &H100, e por fim, o Alias faz para funções o mesmo que o Alias dos DBFs. Então à primeira vista tudo ok.
Quando saiu o Windows Vista, ele bloqueava o "Keyboard" (SendKeys) do VB6, gerando erro, e minha alternativa foi usar essa API.
Então funciona (ou pelo menos funcionava).
Pode ser útil no Harbour pra transferir dados entre janelas, dele próprio ou de fora, por isso estou tentando descobrir.
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/
datato
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 02 Mar 2015 07:56
Localização: sevilla

Chamando API SendKey pelo Harbour

Mensagem por datato »

Hola, has conseguido hacer la funcio Sendkey para enviar teclas a un control ACtivex en harbour?
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Chamando API SendKey pelo Harbour

Mensagem por JoséQuintas »

Nunca mais tentei.

Mas olhando agora, a função envia um EVENTO, e não uma tecla.
E ao invés de FindWindow, seria o handle de onde está o foco, não exatamente a janela do aplicativo.
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
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Chamando API SendKey pelo Harbour

Mensagem por clodoaldomonteiro »

Quintas,
Nesse caso aqui poderia usar um "SetClipboard" para colocar o valor esperado em memória e depois quando tiver aberto a Janela do segundo aplicativo, e aí usar o "PastFromClipboard" para colar o valor esperado.
Isso em teoria, hehe
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Responder