Page 1 of 1

ctrl+U - como la detecto?

Posted: Wed Nov 28, 2007 12:59 am
by rolando
Buenas noches,

Necesito, dentro de un diálogo, detectar cuando se haya pulsado la combinación de teclas "Ctrl + U" que antes usaba en Clipper (chr 21)

hago esto:

oDlg:bKeyDown := {|nK| if(nK==21, ...hacer una cosa... , ....hace otra cosa ) }

Pero siempre me detecta la primera de las dos que presiono (17 para Ctrol y 85 para U).

¿Como puedo hacerlo?.

Gracias.

Rolando :D

Posted: Wed Nov 28, 2007 8:41 am
by Antonio Linares
... if( nK == 85 .and. GetKeyState( VK_CONTROL ), ...

Posted: Wed Nov 28, 2007 10:51 am
by rolando
Buen día,

Gracias por responder pero, sigue sin funcionar.

para testear hice:

oDlg:bKeyDown := {|nK| if(nK == 85 .and. GetKeyState( VK_CONTROL ) , msginfo('21') , msginfo(str(nK)) ) }

Y siempre detecta el caracter 17.

¿Debo hacer una funcióna para esto o hay algo que me falta?

Gracias.

Rolando :D

Posted: Wed Nov 28, 2007 11:00 am
by Antonio Linares
El 85 es la U mayúscula. Usa entonces el 17:

{|nK| If( nK == 17 .and. GetKeyState( VK_CONTROL ), ...

Posted: Wed Nov 28, 2007 11:03 am
by karinha

Code: Select all

    DO CASE

       CASE ( nKey == Asc( "A" ) .OR. nKey == Asc( "a" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+A-For Nilson'
       CASE ( nKey == Asc( "B" ) .OR. nKey == Asc( "b" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+B-For Nilson'
       CASE ( nKey == Asc( "C" ) .OR. nKey == Asc( "c" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+C-For Nilson'
       CASE ( nKey == Asc( "D" ) .OR. nKey == Asc( "d" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+D-For Nilson'
       CASE ( nKey == Asc( "E" ) .OR. nKey == Asc( "e" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+E-For Nilson'
       CASE ( nKey == Asc( "F" ) .OR. nKey == Asc( "f" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+F-For Nilson'
       CASE ( nKey == Asc( "G" ) .OR. nKey == Asc( "g" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+G-For Nilson'
       CASE ( nKey == Asc( "H" ) .OR. nKey == Asc( "h" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+H-For Nilson'
       CASE ( nKey == Asc( "I" ) .OR. nKey == Asc( "i" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+I-For Nilson'
       CASE ( nKey == Asc( "P" ) .OR. nKey == Asc( "p" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+P-For Nilson'
       CASE ( nKey == Asc( "T" ) .OR. nKey == Asc( "t" ) ) .AND. ;
              GetKeyState( VK_CONTROL )
              ? 'Control+T-For Nilson'

       //CASE ( nKey == Asc( "Z" ) .OR. nKey == Asc( "z" ) ) .AND. ;
       //       GetKeyState( VK_CONTROL )
       //       ? 'Control+Z-For Nilson'

       CASE ( nKey == VK_INSERT  .AND. GetKeyState( VK_SHIFT   ) ) .OR. ;
            ( nKey == ASC( "V" ) .AND. GetKeyState( VK_CONTROL ) ) .OR. ;
            ( nKey == ASC( 'X' ) .AND. GetKeyState( VK_CONTROL ) )
            ? ' Multiplas-For Nilson'

       /*
       CASE nKey==VK_F12
              ? 'F12-For Nilson'
       */

       CASE ( nKey == VK_F2 .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F2-For Nilson'
        // Acao(Action) do seu programa
       CASE ( nKey == VK_F3 .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F3-For Nilson'
        // Acao(Action) do seu programa
       CASE ( nKey == VK_F4 .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F4-For Nilson'
        // Acao(Action) do seu programa
       CASE ( nKey == VK_F5  .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F5-For Nilson'
        // Acao(Action) do seu programa
       CASE ( nKey == VK_F6 .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F6-For Nilson'
        // Acao(Action) do seu programa
       CASE ( nKey == VK_F7 .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F7-For Nilson'
        // Acao(Action) do seu programa
       CASE ( nKey == VK_F8 .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F8-For Nilson'
        // Acao(Action) do seu programa
       CASE ( nKey == VK_F9  .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F9-For Nilson'
        // Acao(Action) do seu programa
       //CASE ( nKey == VK_F10 .AND. GetKeyState( VK_CONTROL ) )
       //   ? 'Control+F10-For Nilson'
          // Acao(Action) do seu programa
       CASE ( nKey == VK_F11 .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F11-For Nilson'
          // Acao(Action) do seu programa
       CASE ( nKey == VK_F12 .AND. GetKeyState( VK_CONTROL ) )
          ? 'Control+F12-For Nilson'
          // Acao(Action) do seu programa

    ENDCASE

Posted: Wed Nov 28, 2007 11:06 am
by rolando
Sigo con el mismo problema, ahora detecta apenas se presiona solamente la tecla ctrl.

Lo que necesito es que detecte cuando están ambas presionadas, CTRL y u.

Gracias.
Rolando :D

Posted: Wed Nov 28, 2007 11:10 am
by Antonio Linares
Debería funcionarte así, como te ha mostrado Joao:

{|nK| If( ( nK == Asc( "u" ) ) .and. GetKeyState( VK_CONTROL ), ...

Posted: Wed Nov 28, 2007 11:18 am
by rolando
Gracias, por la tarde lo probaré ya que mi labor diaria me llama.

Rolando :roll:

PRUEBA CON ESTO

Posted: Wed Nov 28, 2007 6:29 pm
by JARO
rolando,
este codigo me funciona bien

#include "FiveWin.ch"
function Main()
local oDlg
DEFINE DIALOG oDlg TITLE "PRUEBA DE PULSACION DE TECLA"
ODLG:BKEYDOWN:={|NKEY|ULTTECLA(NKEY)}
ACTIVATE DIALOG oDlg CENTERED
return nil

FUNCTION ULTTECLA(NKEY)
// yo por si las "_" he anulado las teclas de combinación como
// ctrl en este caso
IF NKEY=17
RETURN NIL
ENDIF
IF NKEY=85 .AND. GetKeyState( 17 )
?"hola" // Aqui pones la funcion que quieras ejecutar
ENDIF
return nil

Espero que te sirva

Posted: Wed Nov 28, 2007 9:23 pm
by rolando
Gracias, ya lo solucioné. Usé como base la función de Jaro que es algo similar a lo de Joao.

Rolando :D