Página 1 de 2

Alternativa a BlockInput

Enviado: 06 Jan 2016 11:19
por André Corrêa
Bom dia,

Alguém tem alguma alternativa para efetuar o bloqueio total do teclado sem utilizar a função BlockInput da API do Windows?
Explico: Utilizávamos o TRAVATEC em nosso sistema, o qual se baseia nessa função, porém, após o Windows XP, ela só funciona
se executar o aplicativo com privilégios de administrador, ou com a UAC desativada.
Infelizmente nosso sistema não pode ser executado como administrador e não podemos desativar a UAC.
Tenho tentado criar uma função em C, que detecte o pressionamento de qualquer tecla (utilizando GetAsyncKeyboardState) e o
troque por nulo, ou algo do tipo, mas não obtive resultado.
Pesquisei bastante no fórum e no Google, mas apesar de ser um problema antigo, parece que ainda não existe solução.
Se alguém tiver alguma alternativa, gostaria de saber.

Obrigado,

Alternativa a BlockInput

Enviado: 06 Jan 2016 12:38
por Jairo Maia
Olá André,

A idéia é bloquear somente o teclado, permitindo acesso ao sistema via mouse por exemplo? Ou seria algo como bloquear o acesso a tudo, teclado e sistema e periféricos.

Em meus sistemas de frente de caixa, se por alguma razão o atendente precisar se afastar do caixa (ir ao banheiro por exemplo), ele pressiona a tecla F6. O sistema aciona uma função solicitando a senha do atendente que está operando, e só libera se for digitado essa senha, ou a máquina for reiniciada com outra senha. Mas não sei se isso serve no seu caso.

Alternativa a BlockInput

Enviado: 06 Jan 2016 12:54
por André Corrêa
Boa tarde Jairo,

Obrigado pelo retorno.
Na verdade, preciso de algo que funcione exatamente como a função BlockInput da API do Windows, mas
que não precise ser executada com privilégios de administrador, ou desativar a UAC.

Alternativa a BlockInput

Enviado: 06 Jan 2016 14:23
por Jairo Maia
Olá André,

E se você usasse um laço para bloquear tudo. Por exemplo:

Código: Selecionar todos

Function Main()
 Local cOpcao := Space( 1 )

 Clear Screen

 While .t.

   @ 12, 35 Say "Bloquear teclado" Get cOpcao Picture "@!" Valid cOpcao $ "SN"
   Read

   If cOpcao = "S"
     BlockActions()
   EndIf

 EndDo

Return Nil

Function BlockActions()
 Clear Screen
 @ 12, 2 Say "Teclado e mouse travados. Pressione CTRL+BREAK ou clique no X para sair..."

 While .t.
  Inkey( 0 )
 EndDo

Return Nil

Alternativa a BlockInput

Enviado: 06 Jan 2016 15:49
por JoséQuintas
Afinal quer bloquear o que?
O teclado no seu aplicativo, ou o Windows inteiro?

Não entendi direito o que quer, ou pra que vai servir isso.
É um novo GPBPlugin? rs

Alternativa a BlockInput

Enviado: 06 Jan 2016 16:25
por André Corrêa
José, usávamos a função BlockInput da API do Windows para bloquear qualquer ação via teclado ou mouse.
Essa função era necessária para homologar o TEF, já que desabilitar qualquer tipo de entrada durante a comunicação
era um pré-requisito.
Atualmente para que essa API funcione, o aplicativo tem que ser executado como adm, ou a UAC do Windows deve ser
desativada. Infelizmente não podemos recorrer a nenhum dos 2 casos.
Estou estudando há alguns dias as APIS GetKeyState, GetKeyboardState, GetASyncKeyState e GetASyncKeyboardState
juntamente com Hook de teclado para anular qualquer tecla pressionada, mas ainda não consegui desenvolver nada
satisfatório.

Alternativa a BlockInput

Enviado: 06 Jan 2016 16:56
por Kapiaba
nem uma reposta no google foi satisfatória, somente como adm.

Código: Selecionar todos

#include <windows.h>
#include <winable.h>
#include <time.h>

int main() {
 BlockInput(true);
 while (clock() < 5000) {}
 BlockInput(false);
}

Código: Selecionar todos

#include <iostream>
#include <windows.h>
#include <winable.h>
int main() {
    BlockInput(true);
    Sleep(10000);
    return 0;
}

Alternativa a BlockInput

Enviado: 06 Jan 2016 18:14
por JoséQuintas
Imaginando que seja pra travar o computador no aplicativo....
Só manter o foco no aplicativo.

Código: Selecionar todos

DO WHILE .T.
   hWnd:SetFocus()
   Inkey(0.1)
ENDDO

Alternativa a BlockInput

Enviado: 07 Jan 2016 08:07
por André Corrêa
Obrigado pelas respostas, mas o problema segue sem solução.
A intenção não é travar o foco no aplicativo, mas bloquear qualquer
entrada via teclado e mouse.
Vou continuar analisando as APIs disponíveis e caso encontre alguma
alternativa interessante, compartilharei aqui.

Alternativa a BlockInput

Enviado: 07 Jan 2016 11:16
por Jairo Maia
Olá André,
André Corrêa escreveu:A intenção não é travar o foco no aplicativo, mas bloquear qualquer entrada via teclado e mouse.
Ok. Agora ficou claro.

Bom, talvez você já tenha visto, mas mesmo assim vai aqui esse link: BlockInput function. Tem exemplo em C++, C# e veb.net.

Alternativa a BlockInput

Enviado: 07 Jan 2016 11:23
por André Corrêa
Obrigado Jairo,

Era o que usávamos, mas houveram essas mudanças que citei.

Alternativa a BlockInput

Enviado: 07 Jan 2016 12:49
por JoséQuintas
Qual o problema na que mencionei?

Abra uma janela que cubra todo desktop e prenda o foco nela.

Inclusive é assim que o programa do Itaú faz.

Aqui uso 3 monitores, e o programa do Itaú cobre TODOS durante o uso.
Desinstalei por causa disso.

Se vale como segurança para o Banco Itaú, porque não pra isso?

Alternativa a BlockInput

Enviado: 07 Jan 2016 14:07
por André Corrêa
Obrigado José, o mouse eu consegui travar assim, vou fazer alguns testes dessa forma.

Alternativa a BlockInput

Enviado: 07 Jan 2016 14:56
por Itamar M. Lins Jr.
Complicado... Não informou qual GUI/GT está usando.
Na Hwgui temos algumas funções...
Podemos perguntar isso ao pessoal do TEF ? Porque é um problema do SO não do aplicativo...
Como fazer isso sem mexer no UAC e ou sem privilégios de adm nas outras linguagens ?
E no Win10, será que irá funcionar isso ?
Prender foco via setfocus() ? usando qual GT ou GUI ? e como sair do laço(while) ? usamos o teclado ? então não travou o teclado...
E se o arquivo txt do TEF não chegar se houver erro na net ? etc...

Se o domínio da situação é controlada pelo aplicativo(programado) e esse precisa de privilégios do SO ?

Saudações,
Itamar M. Lins Jr.

Alternativa a BlockInput

Enviado: 07 Jan 2016 15:20
por André Corrêa
Olá Itamar,

Estou utilizando o Xailer na verdade, mas é totalmente compatível com
Harbour/xHarbour.
Já testei no Win 7, 8 e 10. A situação é a mesma para todos.
A partir do Vista existe essa restrição. Já pesquisei muito na internet via
fóruns e motores de busca, mas até o momento, nada mesmo. Ninguém tem
outra solução.
Minha ideia é fazer um hook de teclado e via API trocar cada tecla pressionada por
nulo. Com o hook, cada tecla digitada é interceptada antes de ser repassada para qualquer
aplicação. Quanto ao mouse, é mais fácil travá-lo em um ponto da tela e desativar os cliques.