CTRL, ALT, e SHIFT
Moderador: Moderadores
CTRL, ALT, e SHIFT
Desde já saudações a todos os clippeiros do forum.
Queria perguntar como fazer um prg que faça o seguinte:
- Quando carrego na tecla CTRL, ALT ou SHIFT, cada uma isoladamente me apareça um menu depois na opção do menu por exemplo 1- Introdução, 2 - apagamento.
- Quando premisse em CTRL aparecia-me em baixo o menu 1- Introdução, 2 - apagamento. Depois se carregasse com o CTRL premido e no 1. Então ia para a rotina introdução.
- Existem dois programas de DOS que conheço que são 2 editores de texto. Simon e Multiedit para clipper que fazem essa magia.
Obrigado
Carlos Lapa
Queria perguntar como fazer um prg que faça o seguinte:
- Quando carrego na tecla CTRL, ALT ou SHIFT, cada uma isoladamente me apareça um menu depois na opção do menu por exemplo 1- Introdução, 2 - apagamento.
- Quando premisse em CTRL aparecia-me em baixo o menu 1- Introdução, 2 - apagamento. Depois se carregasse com o CTRL premido e no 1. Então ia para a rotina introdução.
- Existem dois programas de DOS que conheço que são 2 editores de texto. Simon e Multiedit para clipper que fazem essa magia.
Obrigado
Carlos Lapa
As teclas CTRL, ALT e SHIFT (assim como CapsLock e NumLock) são do tipo passivo. Não geram código no buffer do teclado. Como teclas passivas, elas apenas mudam um estado (um byte na área de dados do DOS). No Clipper não há função que leia esse byte de status, mas existe na CATools a função KbdStat(), que se presta a esse tipo de serviço.
Correção: aí em cima, onde se lê "área de dados do DOS", na verdade, é do BIOS.
Correção: aí em cima, onde se lê "área de dados do DOS", na verdade, é do BIOS.
Editado pela última vez por Maligno em 09 Jan 2008 15:30, em um total de 2 vezes.
[]'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!
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!
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Who? Where?
)))
[]'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!
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!
Lapinha,
Como as teclas ALT, CTRL e SHIFT são passivas, como já foi apontado, elas não fazem sair de estados de espera como o INKEY(0), WAIT etc. Então, se vc quer que uma dessas teclas faça sair de algo como o INKEY(0) e mostrar um MENU, vc tem que fazer, por exemplo, o que se segue.
(ou seja: vc tem que ficar continuamente lendo o teclado - no exemplo a seguir, inkey(0.1) ao invés de inkey(0)...)
Agora, a partir deste exemplo, vc inclua os seus Menus, tomando por base o que a função LASTKEY() retornar... Só note que ALT+ENTER (tela cheia ou não) ou CRTL+ALT+DEL, por exemplo, vc não consegue (eu ACHO) controlar via Clipper, porque essas são teclas de atalho do Windows...
Como as teclas ALT, CTRL e SHIFT são passivas, como já foi apontado, elas não fazem sair de estados de espera como o INKEY(0), WAIT etc. Então, se vc quer que uma dessas teclas faça sair de algo como o INKEY(0) e mostrar um MENU, vc tem que fazer, por exemplo, o que se segue.
(ou seja: vc tem que ficar continuamente lendo o teclado - no exemplo a seguir, inkey(0.1) ao invés de inkey(0)...)
Agora, a partir deste exemplo, vc inclua os seus Menus, tomando por base o que a função LASTKEY() retornar... Só note que ALT+ENTER (tela cheia ou não) ou CRTL+ALT+DEL, por exemplo, vc não consegue (eu ACHO) controlar via Clipper, porque essas são teclas de atalho do Windows...
Código: Selecionar todos
do whil .t.
inkey(0.1) // use inkey("algumvalor") ao invés de inkey("zero")
lk=lastkey() // pega ultima tecla, exceto CRTL ALT SHIFT
if isbit(kbdstat(),1)
?"tecla SHIFT (lado direito) está pressionada"
elseif isbit(kbdstat(),2)
?"tecla SHIFT (lado esquerdo) está pressionada"
elseif isbit(kbdstat(),3)
?"tecla CTRL está pressionada"
elseif isbit(kbdstat(),4)
?"tecla ALT ou SHIFT-ALT está pressionada"
elseif isbit(kbdstat(),5)
?"tecla SCROLLL-LOCK está ativa"
elseif isbit(kbdstat(),6)
?"tecla num-LOCK está ativa"
elseif isbit(kbdstat(),5)
?"tecla CAPS-LOCK está ativa"
elseif isbit(kbdstat(),5)
?"tecla INSERT está ativa"
endi
enddTem razão. Não consegue mesmo. A não ser com o auxílio de um programa Windows.Eolo escreveu:Só note que ALT+ENTER (tela cheia ou não) ou CRTL+ALT+DEL, por exemplo, vc não consegue (eu ACHO) controlar via Clipper, porque essas são teclas de atalho do Windows...
[]'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!
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!
Ficaria mais interessante remover todos os Inkey() do programa (qualquer editor moderno faz isso num instante) e trocar por uma outra função, que agruparia a função Inkey() e diversas outras tarefas. Inclusive o teste das teclas passivas. Eu fiz isso. Tirei Inkey() de todo o sistema. Fica tudo centralizado. Ali eu tenho esse teste das teclas passivas (função ASM própria) pra atender justamente essa mesma necessidade; mas como menus flutuantes. Tenho também auto-desconexão de usuário, protetor de tela, programação de teclas de atalho globais, etc. Ficou muito prático.
[]'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!
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!
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Olha esse negócio de substituir a função INKEY por um looping temporizado, não sei não... Isso deve demandar um certo custo ao processador (mais ainda do que ja tem), bem essa é a minha impressão. Eu ja tive oportunidade de ver esses recursos que não deixam de ser legais, mas chega a ser notável uma certa demora no acionamento do menu e suas funções com esse INKEY(inventado). Mas entendo os recursos que são obtido com esse procedimento e não estou seguro se isso compensa. Eu preferiria o método convencional de uso da tecla de funções (é mais rápido o acesso).
Engraçado que numa hora dizem para não dar muita opção para o usuário porque está sujeito a cometer mais erros. Se você for fazer um inkey(inventado) irá ter que condicionar muito a função (porque um nkey genérico não daria para deixar por conta) para que nem todas as opções possam ser acionadas e deveria ser restritas conforme cada situação que o usuário estiver.
Engraçado que numa hora dizem para não dar muita opção para o usuário porque está sujeito a cometer mais erros. Se você for fazer um inkey(inventado) irá ter que condicionar muito a função (porque um nkey genérico não daria para deixar por conta) para que nem todas as opções possam ser acionadas e deveria ser restritas conforme cada situação que o usuário estiver.
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.
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.
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Eu também já substitui o inkey(), bem como alguns outros poucos comandos...
O menos traumático nesses casos é criar um CH com translates...
O menos traumático nesses casos é criar um CH com translates...
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.
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.
Pois eu notei justamente o contrário. Ficou tão rápido como flexível. Mas isso depende da implementação. A título de curiosidade, listo abaixo um fonte de versão anterior. Mas o que uso é parecido.Pablo César escreveu:Olha esse negócio de substituir a função INKEY por um looping temporizado, não sei não... Isso deve demandar um certo custo ao processador
Código: Selecionar todos
function GetKey(nSeconds,lLockPKeys)
local nInit := Str2Second(Time())
local nKey := 0
local lAlt
local lCtr
local lShf
*
if lKeyLock
clear typeahead
return _kVOID
end
default lLockPKeys to _kFALSE
if lLockPKeys
lAlt := SetAltFlag(_kOFF)
lCtr := SetCtrFlag(_kOFF)
lShf := SetShfFlag(_kOFF)
end
lTimeOut := _kFALSE
while _kTRUE
AltHandle()
CtrHandle()
ShfHandle()
*
if (nKey := KeyLast()) != 0 .or. (nKey := InKey()) != 0
OnKeyPress()
if RunGlobKey(nKey) .or. FKsBoxProp(nKey)
nKey :=0
else
exit
end
end
*
if nSeconds = _kVOID
exit
end
if nSeconds != 0
if nSeconds = Str2Second(Time())-nInit
lTimeOut := _kTRUE
exit
end
end
end
*
if lLockPKeys
SetAltFlag(lAlt)
SetCtrFlag(lCtr)
SetShfFlag(lShf)
end
return nKeyDisso eu discordo. Erros são parte do trabalho. Restringir as opções do usuário por medo de errar é um deles.Engraçado que numa hora dizem para não dar muita opção para o usuário porque está sujeito a cometer mais erros.
[]'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!
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!
ALT CTRL E SHIFT
Bom Dia,
Maligno
O compilador do clipper diz que dá sintax error neste local
lLockPKeys
Maligno
O compilador do clipper diz que dá sintax error neste local
lLockPKeys
Opa! Esse fonte é apenas um exemplo de lógica para uma nova InKey(). Não era pra compilar mesmo. Até porque, não está completo. 
[]'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!
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!

