Página 2 de 2
Enviado: 21 Dez 2007 21:54
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.
Enviado: 23 Dez 2007 01:40
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!
Enviado: 24 Dez 2007 10:09
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.
CapsLock e NumLock
Enviado: 24 Dez 2007 13:02
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
Enviado: 25 Dez 2007 10:47
por evaldo
Ola MarceloG e para o NUM LOCK, o que teria que mudar na sua funcao?
NumLock / CapsLock / Scroll Lock
Enviado: 26 Dez 2007 13:53
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
Enviado: 26 Dez 2007 19:43
por sygecom
Achei na HWGUI tmb.
@ 10,10 say ISCAPSLOCKACTIVE()
@ 11,10 say ISNUMLOCKACTIVE()
Enviado: 03 Jan 2008 00:40
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.

Enviado: 10 Jan 2008 21:10
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 ?
Enviado: 02 Abr 2008 13:33
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!
Enviado: 02 Abr 2008 13:45
por sygecom
Compile o exemplo da seguinte pasta:
\minigui\SAMPLES\Advanced\IconView
Enviado: 02 Abr 2008 13:52
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