Peguei este código do VB6 (mais fácil pra mim entender o tipo de parâmetro, ou se precisa ser por referência)
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"
#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.