Mudar bool de False para True ao pressionar a tecla?

Aug 17 2020

Gostaria de permitir que uma variável booleana mudasse quando pressiono uma tecla no teclado.

Por exemplo, eu escrevo

activateE := Block[{}, edown = True;];
SetOptions[EvaluationNotebook[], NotebookEventActions -> {{"KeyDown", "e"} :> activateE}]

e, em seguida, tente monitorar os pressionamentos de tecla por meio de

edown = False;
Dynamic[edown]

Embora a tecla eagora pare de produzir qualquer entrada de texto no bloco de notas, infelizmente o Dynamicsempre continua aparecendo False, independentemente da frequência com que pressiono a tecla e. O que estou fazendo de errado ou como fazer da maneira correta?

EDITAR:

Como alternativa, estou tentando a CurrentValuefunção. Por exemplo,

Dynamic[CurrentValue["ModifierKeys"]]

mostra corretamente, por exemplo, quando a Ctrltecla está sendo pressionada. Mas se eu tentar

Dynamic[CurrentValue["EventKey"]]

a saída é Noneindependente da tecla que pressiono. Existe a opção de CurrentValueregistrar um pressionamento de tecla regular, como uma letra e?

EDIT2:

O que parece funcionar é

EventHandler[InputField[], {"KeyDown", "e"} :> activateE]

mas apenas se eu clicar primeiro em InputField para colocá-lo em foco.

Respostas

4 kglr Aug 17 2020 at 00:22

Usar NotebookEventActionscom a opção PassEventsUp -> Truefornece o comportamento desejado na versão 11.3 (Windows 10 - 64 bits):

ClearAll[activateE]
activateE:=  Block[{}, edown = True;];
SetOptions[EvaluationNotebook[], 
 NotebookEventActions -> {{"KeyDown", "e"} :> activateE, PassEventsUp -> True}]

Uma variação: alternar entre Falsee Truequando a tecla eé pressionada:

$Version

"11.3.0 para Microsoft Windows (64 bits) (7 de março de 2018)"