Clipper On Line • Ver Tópico - Chamando API SendKey pelo Harbour

Chamando API SendKey pelo Harbour

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

Moderador: Moderadores

 

Chamando API SendKey pelo Harbour

Mensagempor JoséQuintas » 10 Mai 2013 20:36

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)

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Chamando API SendKey pelo Harbour

Mensagempor datato » 25 Abr 2021 16:36

Hola, has conseguido hacer la funcio Sendkey para enviar teclas a un control ACtivex en harbour?
datato
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 3
Data de registro: 02 Mar 2015 07:56
Cidade/Estado: sevilla
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Chamando API SendKey pelo Harbour

Mensagempor JoséQuintas » 25 Abr 2021 18:46

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Chamando API SendKey pelo Harbour

Mensagempor clodoaldomonteiro » 26 Abr 2021 09:16

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
Avatar de usuário

clodoaldomonteiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 752
Data de registro: 30 Dez 2006 12:17
Cidade/Estado: Teresina-PI
Curtiu: 115 vezes
Mens.Curtidas: 31 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro