Página 1 de 1

Chamando API SendKey pelo Harbour

Enviado: 10 Mai 2013 20:36
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.

Chamando API SendKey pelo Harbour

Enviado: 25 Abr 2021 16:36
por datato
Hola, has conseguido hacer la funcio Sendkey para enviar teclas a un control ACtivex en harbour?

Chamando API SendKey pelo Harbour

Enviado: 25 Abr 2021 18:46
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.

Chamando API SendKey pelo Harbour

Enviado: 26 Abr 2021 09:16
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