Caps Lock Desligado

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

Moderador: Moderadores

Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Em tempo: acabei de confirmar pelo fonte da função KSetCaps(). Ela realmente seta um byte no endereço 40:17 (BIOS data area) para alterar o estado das teclas Caps, Num, etc. Portanto, em kernel NT pode esquecer. Mas nos demais SOs, funciona.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Interessante,

Mas apenas complementando...

Num é nada de outro mundo ligar uma função no memoedit para só ecoar caracteres em maiúsculo, da pra fazr isso aí sim, e com tranquilidade.

Falou!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Também olhei o fonte da função ksetcaps(), e vi que ele usa as api´s do windows(r) prá realizar a ativação/ desativação da tecla.
Então, por que não funciona em windows(r) nt?

E a Nanfor, com início FT usa o mesmo esquema!

Tudo bem, vamos fazer dois cheques de trinta (coisa de loira)!

Deixe o usuário editar a vontade, na hora de gravar a informação use um upper(cmemo).

Na próxima vez que abrir o campo, ele vai estar maiúsculo.

Como ele já vai estar maiúsculo, acho difícil o 'cidadão' não ativar o capslock e continuar no padrão.

MarceloG.
Água mole em pedra dura tanto bate que até espirra!
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

CapsLock e NumLock

Mensagem por MARCELOG »

No Windows 95, Windows 98 ou Windows Me, usa-se a função API SetKeyboardState para definir o estado da chave.
Nesse caso KSetCaps(.T.) funciona (não testei).

No Windows NT ou Windows 2000, usa-se a função keybd_event para simular uma tecla pressionada.

Então, criei a função abaixo, por favor testem Windows 95, Windows 98 ou Windows Me.

No XP e NT funcionou legal.

Código: Selecionar todos

FUNCTION MAIN()
CLS
SETCAPSLOCK(.T.)
INKEY(0)
SETCAPSLOCK(.F.)
RETURN

#pragma begindump

#include <shlobj.h>
#include <windows.h>
#include "hbapi.h"


HB_FUNC( SETCAPSLOCK )


{

 BYTE keyState[256];

 GetKeyboardState((LPBYTE)&keyState);

 if( (hb_parnl(1) && (keyState[VK_CAPITAL] & 0)) )
     {

         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );

         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }

      else

      {

         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );

         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }


   }

#pragma enddump
Espero ter ajudado.

MarceloG
Editado pela última vez por Pablo César em 25 Fev 2013 12:30, em um total de 2 vezes.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Água mole em pedra dura tanto bate que até espirra!
evaldo
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 27 Out 2005 23:29

Mensagem por evaldo »

Ola MarceloG e para o NUM LOCK, o que teria que mudar na sua funcao?
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

NumLock / CapsLock / Scroll Lock

Mensagem por MARCELOG »

Olá pessoal,
alterei e renomeei a função para funcionar com qualquer tecla.

Código: Selecionar todos

#define HB_VK_INSERT         0x2D
#define HB_VK_CAPITAL        0x14
#define HB_VK_NUMLOCK        0x90
#define HB_VK_SCROLL         0x91

FUNCTION MAIN()
CLS
PRESSKEY(HB_VK_CAPITAL)
INKEY(0)
PRESSKEY(HB_VK_NUMLOCK)
RETURN

#pragma begindump

#include <shlobj.h>
#include <windows.h>
#include "hbapi.h"


HB_FUNC( PRESSKEY )

/* 
testa a tecla e pressiona
*/

{

 BYTE keyState[256];

 GetKeyboardState((LPBYTE)&keyState);

 if (keyState[hb_parni(1)] == 0)  // testa se a tecla est  ativa

    {

    // Simula pressionamento

     keybd_event( hb_parni(1),
                  0x45,
                  KEYEVENTF_EXTENDEDKEY | 0,
                  0 );

     keybd_event( hb_parni(1),
                  0x45,
                  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                  0 );
    }

}

#pragma enddump
Espero que ajude.

MarceloG
Editado pela última vez por Pablo César em 26 Set 2012 21:03, em um total de 2 vezes.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Água mole em pedra dura tanto bate que até espirra!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Achei na HWGUI tmb.
@ 10,10 say ISCAPSLOCKACTIVE()
@ 11,10 say ISNUMLOCKACTIVE()
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

MARCELOG escreveu:Também olhei o fonte da função ksetcaps(), e vi que ele usa as api´s do windows(r) prá realizar a ativação/ desativação da tecla.
Então, por que não funciona em windows(r) nt?
Ah, só tinha visto o início do arquivo e não percebi que há uma série de diretivas de teste de sistema que, compila para DOS ou Windows (NT) de forma separada. Portanto, se não funciona pro seu Windows é porque a compilação foi feita para DOS/Win98. Veja lá. É isso. Ao invés de testarem qual o SO rodando pra direcionar pra esta ou aquela solução, eles montaram códigos separados. Como é parte do pré-processamento, logicamente, você só pode ter um ou outro bloco de código. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Puxa pessoal, você me fazem sentir um pouco de inveja (inveja benigna... assim que se fala Maligno ?), falo isto pelo alto nível no conhecimento de você, me deixa com muita vontade de poder encontrá-los no eventos em São Paulo (assim espero).
Grings escreveu:Luciano, o motivo é que uso memoedit() ...//...O problema é que durante a edição aparece minúsculo.
Você faz essa conversão de caracteres para maiusculos (para caracteres acentuados também) na função que controla o memoedit ? Pois você poderia retornar com CHR(8) dar um KEYBOARD <caracter_maiusculo>, daí daria sensação que corrigiria o minusculo por maiusculo e forçaria a tudo ser maiusculo. Isso não funcionaria em xHarbour ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
danielrxavier
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 16 Abr 2007 22:55

Mensagem por danielrxavier »

usando minigui fiz o seguinte:

Código: Selecionar todos

WHILE .NOT. ISCAPSLOCKACTIVE()
   Msg=MsgYesNoCancel ('ATIVE CAPSLOCK',,,,)
   if Msg=1
      elseif Msg=0
      if KSETCAPS(.T.)
         msgbox('ativou')
      else                                        
         msgbox('nao ativou')
      endif
   else
      quit
   endif
ENDDO
funciona, mas a luz do capslock não acende e continua escrevendo em minusculo.
???
invocado!
Editado pela última vez por Pablo César em 10 Mai 2012 20:11, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Compile o exemplo da seguinte pasta:
\minigui\SAMPLES\Advanced\IconView
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
danielrxavier
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 16 Abr 2007 22:55

Mensagem por danielrxavier »

desculpa pessoal

na verdade quando vou digitar fica em MAIÚSCULO sim, porém a luz do capslock continua apagada.

e se apertar capslock para a luz acender começa a escrever minúsculo
Responder