PDA

Ver la Versión Completa : [Sintaxis] Detectar teclas de flechas (Sheet)


Eslopes
2 de junio de 2016, 02:43
Olá,

alguém sabe como detectar o pressionamento das teclas de seta (arriba, abajo, derecha, izquierda) no Powercobol 3.0 ?

Preciso que seja igual ao funcionamento do botão com PFx (teclas de função), ou seja, o foco não precisa estar no campo para o Power detectar a tecla (talvez algo com timer).

[]s, Emerson

Kuk
2 de junio de 2016, 09:30
Eslopes, el PWC3 no integra dicha posibilidad. Para hacerlo bien (y captar otros eventos) lo que hay que hacer es sustitución del MessageLoop en WinMain. Yo lo he conseguido, lo que pasa es que la tecla TAB deja de funcionar así que de momento no considero esta opción como la mejor.

Puedes intentar con un TIMER y GetAsyncKeyState function (Windows) (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293%28v=vs.85%29.aspx)

Eslopes
3 de junio de 2016, 03:16
Biens,

estou usando teclas de função (PF5, PF6 e PF7), mas queria mesmo usar as setas.

Segue uma imagem do que estou fazendo ;)

[]s,Emerson

252

Kuk
3 de junio de 2016, 11:27
Eslopes, ¿es un juego?! :astro:

Intenta con la función que te he dicho y si no sale pensamos en otra solución ;)

Eslopes
3 de junio de 2016, 14:32
Olá,

sim, é um juego! Aliás, vai ser bem viciante, rs.

Tem algum exemplo de como chamar a API ? Tentei com call mas deu erro...

Gracias, Emerson

Kuk
3 de junio de 2016, 14:46
Eslopes, tienes que meter en opciones de compilación NOALPHA.

La sintaxis para llamar WinAPI es:


CALL "MessageBoxA" WITH STDCALL USING BY VALUE WS-HWND
BY REFERENCE WS-MSG
BY REFERENCE WS-HEADER
BY VALUE WS-STYLE

Eslopes
4 de junio de 2016, 16:03
Olá,

tentei o seguinte código sem sucesso:

01 inKeyCode PIC S9(04) COMP-5.
PROCEDURE DIVISION.
CALL "GetAsyncKeyState" WITH STDCALL USING BY REFERENCE inKeyCode

DISPLAY inKeyCode

inkeycode sempre retorna +0000

Alguma idéia?

[]s, Emerson

Kuk
4 de junio de 2016, 17:04
Eslopes, ponlo en un TIMER y haz DISPLAY, a ver si cambia cuando pinchas una tecla.

Eslopes
4 de junio de 2016, 22:13
Olá,

esqueci de dizer que o código acima estava num timer disparado a cada 10ms. Mesmo assim simplesmente não retorna nada.

De acordo com o manual do Power3, o retorno seria através do registro especial "PROGRAM-STATUS". O retorno é sempre zero.

Alguma idéia ?

[]s, Emerson

Kuk
5 de junio de 2016, 12:05
Eslopes, voy a intentar a mirar qué más opciones hay y te digo.

Eslopes
5 de junio de 2016, 12:53
Olá,

encontrei uma possível solução :)



ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INDICEKEY PIC 9(03) VALUE 1.
01 keyBoard.
03 aKeyCode PIC S9(09) COMP-5 VALUE 0.
03 keys PIC X(256).



PROCEDURE DIVISION.

MOVE 0 TO aKeyCode

CALL "GetKeyState" WITH STDCALL USING aKeyCode

MOVE SPACES TO keys

CALL "GetKeyboardState" WITH STDCALL USING keys

IF keys(38:1) > X"01"
DISPLAY "LEFT"
END-IF

IF keys(39:1) > X"01"
DISPLAY "UP"
END-IF


IF keys(40:1) > X"01"
DISPLAY "RIGHT"
END-IF

IF keys(41:1) > X"01"
DISPLAY "DOWN"
END-IF


Agora posso terminar o jogo :cerv:

Gracias, Emerson

Kuk
5 de junio de 2016, 16:32
Eslopes, para qué haces la llamada a "GetKeyState" si no usas su retorno después?

Eslopes
5 de junio de 2016, 17:43
Olá,

de acordo com o post do forum abaixo, nem sempre o Windows faz um scan das teclas, então GetKeyState força este scan.


I'v been using GetAsyncKeyState quite extensively without any issues. But if you follow the news groups, you'll realize that GetKeyboardState does have a quirk which is really not identified in the MS docs. The quirk is that the message processing can go out of synch based on how the messages are processed. In other words, Windows can sometimes avoid updating the keystate buffer if for some unknown reason it feels that updating the buffer is not necessary at times. Thus, the key state buffer may not be up to date and in sych with the input message queue. The news group folks recommend calling GetKeyState prior to calling GetKeyboardState to eliminate this potential problem.


GetKeyboardState() problem (http://cboard.cprogramming.com/windows-programming/106644-getkeyboardstate-problem.html)


Saludos, Emerson

Jovimabo
7 de junio de 2016, 13:59
Hola, no estoy seguro si esta subrutina te pueda servir
CBL_READ_SCR_KEY
Consultala en el manual de CBL Subroutines
User’s Guide capitulo 11
Esto es de NetCOBOL CBL routines.

Eslopes
7 de junio de 2016, 14:21
Olá, esta era minha primeira opção, mas o PowerCobol 3 não tem suporte para esta rotina, apenas a versão 4 em diante.

Todavia, a chamada à API que usei está funcionando perfeitamente. Ela poderia inclusive ser usada para criar uma rotina de entrada de dados, substituindo o uso de Textbox (pense no caso de uma aplicação de POS - Point Of Sale).

Saludos, Emerson

Eslopes
7 de junio de 2016, 17:15
Uma outra coisa, a API detecta (e retorna) múltiplas teclas pressionadas, incluindo se estão em CAPS LOCK, ou se CONTROL, SHIFT ou mesmo se as teclas do mouse foram pressionadas. É um muito interessante mesmo.

Saludos, Emerson

Adrianeloy
9 de junio de 2016, 16:37
Eslopes, tu rutina funciona a la perfección, aqui estan los codigos del resto de las teclas...
NOTA: para detectar una tecla con el ejemplo de Eslopes, debemos sumarle uno al código.

Código Tecla
1 LButton
2 RButton
3 Cancel
4 Mbutton (no contigüo a L & RBUTTON)
8 Back
9 Tab
12 Clear
13 Return
16 Shift
17 Control
18 Menu
19 Pause
20 Capital
27 Escape
32 Space
33 Prior
34 Next
35 End
36 Home
37 Left
38 Up
39 Right
40 Down
41 Select
42 Print
43 Execute
44 SnapShot
44 Copy (no usada x teclado)
45 Insert
46 Delete
47 Help
65-90 Teclas 'A' hasta 'Z'
97-122 Teclas 'a' hasta 'z'
45-57 Teclas '0' hasta '9'
96 NumPad0
97 NumPad1
98 NumPad2
99 NumPad3
100 NumPad4
101 NumPad5
102 NumPad6
103 NumPad7
104 NumPad8
105 NumPad9
106 Multiply
107 Add
108 Separator
109 Subtract
110 Decimal
111 Divide
112 F1
113 F2
114 F3
115 F4
116 F5
117 F6
118 F7
119 F8
120 F9
121 F10
122 F11
123 F12
124 F13
125 F14
126 F15
127 F16
128 F17
129 F18
130 F19
131 F20
132 F21
133 F22
134 F23
135 F24
144 NumLock
145 Scroll