Clipper On Line • Ver Tópico - "ON KEY" para todo sistema

"ON KEY" para todo sistema

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

"ON KEY" para todo sistema

Mensagempor casesistemas » 02 Dez 2013 17:59

Boa Tarde

Estou tentando declarar ON KEY ... no Formulario Principal, porem o proximo formulario nao reconhece esat tecla.

ex: tenho uma calculadora declarada como F10 e gostaria de chama-la em todo sistema

Joao Carlos
CASE Sistemas
casesistemas
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 31
Data de registro: 04 Ago 2004 16:50
Cidade/Estado: Campinas/SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

"ON KEY" para todo sistema

Mensagempor alxsts » 02 Dez 2013 18:10

Olá!

Talvez este código possa te dar alguma ideia.
/*
* HMG ON KEY Demo
*/

/*

Available Keys

   F1
   F2
   F3
   F4
   F5
   F6
   F7
   F8
   F9
   F10
   F11
   F12
   BACK
   TAB
   RETURN
   ESCAPE
   END
   HOME
   LEFT
   UP
   RIGHT
   DOWN
   INSERT
   DELETE
   PRIOR
   NEXT
   ALT+A
   ALT+B
   ALT+C
   ALT+D
   ALT+E
   ALT+F
   ALT+G
   ALT+H
   ALT+I
   ALT+J
   ALT+K
   ALT+L
   ALT+M
   ALT+N
   ALT+O
   ALT+P
   ALT+Q
   ALT+R
   ALT+S
   ALT+T
   ALT+U
   ALT+V
   ALT+W
   ALT+X
   ALT+Y
   ALT+Z
   ALT+0
   ALT+1
   ALT+2
   ALT+3
   ALT+4
   ALT+5
   ALT+6
   ALT+7
   ALT+8
   ALT+9
   ALT+F1
   ALT+F2
   ALT+F3
   ALT+F4
   ALT+F5
   ALT+F6
   ALT+F7
   ALT+F8
   ALT+F9
   ALT+F10
   ALT+F11
   ALT+F12
   ALT+BACK
   ALT+TAB
   ALT+RETURN
   ALT+ESCAPE
   ALT+END
   ALT+HOME
   ALT+LEFT
   ALT+UP
   ALT+RIGHT
   ALT+DOWN
   ALT+INSERT
   ALT+DELETE
   ALT+PRIOR
   ALT+NEXT
   SHIFT+A
   SHIFT+B
   SHIFT+C
   SHIFT+D
   SHIFT+E
   SHIFT+F
   SHIFT+G
   SHIFT+H
   SHIFT+I
   SHIFT+J
   SHIFT+K
   SHIFT+L
   SHIFT+M
   SHIFT+N
   SHIFT+O
   SHIFT+P
   SHIFT+Q
   SHIFT+R
   SHIFT+S
   SHIFT+T
   SHIFT+U
   SHIFT+V
   SHIFT+W
   SHIFT+X
   SHIFT+Y
   SHIFT+Z
   SHIFT+0
   SHIFT+1
   SHIFT+2
   SHIFT+3
   SHIFT+4
   SHIFT+5
   SHIFT+6
   SHIFT+7
   SHIFT+8
   SHIFT+9
   SHIFT+F1
   SHIFT+F2
   SHIFT+F3
   SHIFT+F4
   SHIFT+F5
   SHIFT+F6
   SHIFT+F7
   SHIFT+F8
   SHIFT+F9
   SHIFT+F10
   SHIFT+F11
   SHIFT+F12
   SHIFT+BACK
   SHIFT+TAB
   SHIFT+RETURN
   SHIFT+ESCAPE
   SHIFT+END
   SHIFT+HOME
   SHIFT+LEFT
   SHIFT+UP
   SHIFT+RIGHT
   SHIFT+DOWN
   SHIFT+INSERT
   SHIFT+DELETE
   SHIFT+PRIOR
   SHIFT+NEXT
   CONTROL+A
   CONTROL+B
   CONTROL+C
   CONTROL+D
   CONTROL+E
   CONTROL+F
   CONTROL+G
   CONTROL+H
   CONTROL+I
   CONTROL+J
   CONTROL+K
   CONTROL+L
   CONTROL+M
   CONTROL+N
   CONTROL+O
   CONTROL+P
   CONTROL+Q
   CONTROL+R
   CONTROL+S
   CONTROL+T
   CONTROL+U
   CONTROL+V
   CONTROL+W
   CONTROL+X
   CONTROL+Y
   CONTROL+Z
   CONTROL+0
   CONTROL+1
   CONTROL+2
   CONTROL+3
   CONTROL+4
   CONTROL+5
   CONTROL+6
   CONTROL+7
   CONTROL+8
   CONTROL+9
   CONTROL+F1
   CONTROL+F2
   CONTROL+F3
   CONTROL+F4
   CONTROL+F5
   CONTROL+F6
   CONTROL+F7
   CONTROL+F8
   CONTROL+F9
   CONTROL+F10
   CONTROL+F11
   CONTROL+F12
   CONTROL+BACK
   CONTROL+TAB
   CONTROL+RETURN
   CONTROL+ESCAPE
   CONTROL+END
   CONTROL+HOME
   CONTROL+LEFT
   CONTROL+UP
   CONTROL+RIGHT
   CONTROL+DOWN
   CONTROL+INSERT
   CONTROL+DELETE
   CONTROL+PRIOR
   CONTROL+NEXT

*/

#include "hmg.ch"

Function Main
Local bBlock

   DEFINE WINDOW Win_1 ;
      AT 0,0 ;
      WIDTH 400 ;
      HEIGHT 400 ;
      TITLE 'Hello World!' ;
      MAIN 

      ON KEY SHIFT+A ACTION MsgInfo ('Shift+A')
      ON KEY TAB ACTION MsgInfo ('TAB')
      ON KEY RETURN ACTION MsgInfo ('RETURN')
      ON KEY CONTROL+END ACTION MsgInfo ('CONTROL+END')
      ON KEY ESCAPE ACTION MsgInfo ('ESCAPE')
      ON KEY ALT+C ACTION MsgInfo ('ALT+C')

      DEFINE BUTTON Button_1
         ROW 10
         COL 10
         CAPTION 'Activate F2'
         ACTION EnableF2()
      END BUTTON

      DEFINE BUTTON Button_2
         ROW 40
         COL 10
         CAPTION 'Release F2'
         ACTION DisableF2()
      END BUTTON

      DEFINE BUTTON Button_3
         ROW 70
         COL 10
         CAPTION 'Store Key Test'
         ACTION StoreTest()
      END BUTTON

   END WINDOW

   ACTIVATE WINDOW Win_1

Return

Procedure EnableF2()
   ON KEY F2 OF Win_1 ACTION MsgInfo ('F2')
Return

Procedure DisableF2()
   RELEASE KEY F2 OF Win_1
Return

Procedure StoreTest()
Local bBlock

   STORE KEY RETURN OF Win_1 TO bBlock

   RELEASE KEY RETURN OF Win_1

   ON KEY RETURN OF Win_1 ACTION Eval ( bBlock )

Return
Encontra-se em C:\HMG.3.0.35\SAMPLES\ON.KEY.1\demo.prg, em uma instalação padrão da HMG 3.0.35.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

"ON KEY" para todo sistema

Mensagempor Claudio Soto » 07 Dez 2013 18:20

casesistemas escreveu:Boa Tarde

Estou tentando declarar ON KEY ... no Formulario Principal, porem o proximo formulario nao reconhece esat tecla.

ex: tenho uma calculadora declarada como F10 e gostaria de chama-la em todo sistema

Joao Carlos
CASE Sistemas

Hola Joao Carlos,
la única forma es hacer un hook de teclado.
Fíjate en estos links:
http://www.hmgforum.com/viewtopic.php?p=31154#p31154
http://www.hmgforum.com/viewtopic.php?f=15&t=1331
Saludos,
Claudio.
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

"ON KEY" para todo sistema

Mensagempor Toledo » 07 Dez 2013 21:04

Amigos, na MiniGui Extended tem o comando SET GLOBALHOTKEYS ON, mas pelo que notei este comando é só usado para programas que vão ficar em execução no System Tray (na barra do Windows, do lado do relógio), pois mesmo estando em um outro programa aberto, a Hotkey vai funcionar. Por exemplo, se você abrir o seu programa e minimizar ele e abrir também o Word, a tecla Hotkey vai funcionar dentro do Word ou qualquer outro programa que esteja sendo executado.

Eu testei apenas os exemplos que estão na pasta \SAMPLES, que usam este comando SET GLOBALHOTKEYS ON, e todos eles são executados no System Tray, então não sei qual será o efeito em um programa que abre em uma janela normal.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

"ON KEY" para todo sistema

Mensagempor alxsts » 07 Dez 2013 22:48

Olá!

MiniGui não é minha praia mas, fico pensando se não seria possível fazer o seguinte, usando SET GLOBALHOTKEYS ON:

- ativar as teclas desejadas no início do programa, ao carregar a janela principal;
- desativar as teclas ao minimizar a janela principal;
- ativar as teclas ao maximizar a janela principal;
- desativar as teclas ao fechar a janela principal;
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

"ON KEY" para todo sistema

Mensagempor Pablo César » 08 Dez 2013 10:49

Boa ideia Alexandre ! Acho que é muito bem que seja possível implementar isso nos eventos:

ON MAXIMIZE
ON MINIMIZE
ON RELEASE

You are great ! :)
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.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

"ON KEY" para todo sistema

Mensagempor Claudio Soto » 08 Dez 2013 12:18

Esto es una simplificación del ejemplo que esta en C:\MiniGUI\SAMPLES\Advanced\ReadKey
Espero que les sirva de ayuda.
Saludos,
Claudio.

****************************************************************************
* PROGRAMA: READ THE KEYBOARD
* LENGUAJE: HARBOUR-MINIGUI
* FECHA:    13 ABRIL 2010
* AUTOR:    CLAUDIO SOTO
* PAIS:     URUGUAY
* E-MAIL:   srvet@adinet.com.uy
****************************************************************************

***************************************************************************************************
* DESCRIPCION
*
* Lee las entradas entradas del teclado y devuelve informacion sobre la tecla presionada.
* Estas funciones interceptan los mensajes de teclado que el sistema le envia a la aplicacion
* (WM_KEYUP y WM_KEYDOWN) y almacena informacion sobre la tecla virtual generada. 
*
***************************************************************************************************
* SINTAXIS:
*
* INSTALL_READ_KEYBOARD ()   // Instala el manejador que lee el teclado (Retorna .T. si tiene exito)
* UNINSTALL_READ_KEYBOARD () // Desinstala el manejador que lee el teclado (Retorna .T. si tiene exito)
*
* GET_LAST_VK()              // Retorna el valor virtual (VK Code) de la tecla presionada
* GET_LAST_VK_NAME()         // Retorna el nombre de la tecla virtual presionado
*
* GET_STATE_VK_SHIFT ()      // Retorna .T. si la tecla SHIFT esta presionada
* GET_STATE_VK_CONTROL ()    // Retorna .T. si la tecla CONTROL esta presionada
* GET_STATE_VK_ALT ()        // Retorna .T. si la tecla ALT esta presionada
*
* PAUSE_READ_VK (.T.)        // Pausa la lectura del teclado para poder procesar la tecla presionada
* PAUSE_READ_VK (.F.)        // Restablece la lectura del teclado luego de la pausa
*
***************************************************************************************************

#include "minigui.ch"

Procedure Main

   DEFINE WINDOW Form_1 ;
      AT 0,0 ;
      WIDTH 400 ;
      HEIGHT 600 ;
      TITLE 'Form_1' ;
      MAIN ;
      ON INIT On_Init();
      ON RELEASE On_Release()

      @ 380 , 10 LABEL Label_10 VALUE "Presionar SHIFT + A abre Caja Dialogo" AUTOSIZE BOLD

      @ 450 , 10 EDITBOX EditBox_1  WIDTH 200 HEIGHT 100 VALUE "Escribir algo"

   END WINDOW

   DEFINE WINDOW Form_2 ;
      AT 0,0 ;
      WIDTH 300 ;
      HEIGHT 200 ;
      TITLE 'Form_2' ;
      CHILD
      @ 10 , 10 EDITBOX EditBox_1  WIDTH 200 HEIGHT 100 VALUE "Escribir algo"
   END WINDOW

   Form_1.Center

   ACTIVATE WINDOW Form_1, Form_2

Return

Procedure On_Init
   IF INSTALL_READ_KEYBOARD() == .F.
      MsgInfo ("ERROR al instalar READ_KEYBOARD")
   ELSE
      DEFINE TIMER timer_1 OF Form_1 INTERVAL 100 ACTION Procesar_Tecla()
   ENDIF
Return

Procedure On_Release
   IF UNINSTALL_READ_KEYBOARD() == .F.
      MsgInfo ("ERROR al desinstalar READ_KEYBOARD")
   ENDIF
Return

Procedure Procesar_Tecla
Static Flag := .F.

  IF Flag == .T.
     Return   //  impide la reentrada
  Endif
  Flag := .T.
 
  IF GET_LAST_VK() == 65 .AND. GET_STATE_VK_SHIFT() == .T.  //  VK code de A = 65
      PAUSE_READ_VK (.T.) // pausa la lectura del teclado

      Msginfo ("Procesar la accion de la tecla SHIFT + A")

      PAUSE_READ_VK (.F.) // restablece la lectura del teclado
  ENDIF
 
  Flag := .F.
Return

*##################################################################################################
*   FUNCIONES EN C       
*##################################################################################################

#pragma begindump

#include <windows.h>
#include "hbapi.h"

HB_BOOL flag_hhk = FALSE;
HB_BOOL PAUSE_hhk = FALSE;
HHOOK hhk = NULL;
HB_LONG VK_PRESIONADO = 0;
HB_LONG VK_lParam = 0;

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
        return CallNextHookEx(hhk, nCode, wParam, lParam);
       
    if (PAUSE_hhk == FALSE)
    {   VK_PRESIONADO = (long) wParam;
        VK_lParam = (LONG) lParam;
    }
    else   
    {   VK_PRESIONADO = 0;
        VK_lParam = 0;
    }   
   
    return CallNextHookEx(hhk, nCode, wParam, lParam);
}

HB_FUNC (GET_STATE_VK_SHIFT)
{
   if (GetKeyState(VK_SHIFT) & 0x8000)
       hb_retl (TRUE);
   else   
       hb_retl (FALSE);
}

HB_FUNC (GET_STATE_VK_CONTROL)
{
   if (GetKeyState(VK_CONTROL) & 0x8000)
       hb_retl (TRUE);
   else   
       hb_retl (FALSE);
}

HB_FUNC (GET_STATE_VK_ALT)
{
   if (GetKeyState(VK_MENU) & 0x8000)
       hb_retl (TRUE);
   else   
       hb_retl (FALSE);
}

HB_FUNC (GET_LAST_VK)
{
   if (flag_hhk == TRUE)
       hb_retnl (VK_PRESIONADO);
   else
      hb_retnl (0);   
}

HB_FUNC (GET_LAST_VK_NAME)
{
   CHAR cadena [128];

   if (flag_hhk == TRUE)
      {  GetKeyNameText (VK_lParam, (LPTSTR) &cadena, 128);
         hb_retc (cadena);
      }
   else
      hb_retc ("");   
}

HB_FUNC (PAUSE_READ_VK)
{
   if (hb_pcount () == 1 && hb_parinfo (1) == HB_IT_LOGICAL)   
   {   if (hb_parl (1) == TRUE)
       {   VK_PRESIONADO = 0;
           VK_lParam = 0;
       }     
       PAUSE_hhk = hb_parl (1);
   }
}

HB_FUNC (INSTALL_READ_KEYBOARD)
{
   if (flag_hhk == FALSE)
   {    hhk = SetWindowsHookEx (WH_KEYBOARD, KeyboardProc, (HINSTANCE) NULL, GetCurrentThreadId());
       
        if (hhk == NULL)
            hb_retl (FALSE);
        else
        {   flag_hhk = TRUE;   
            hb_retl (TRUE);                       
        }   
   }
   else
      hb_retl (TRUE);     
}

HB_FUNC (UNINSTALL_READ_KEYBOARD)
{
   if (flag_hhk == TRUE)
   {   if (UnhookWindowsHookEx (hhk) == TRUE)
       {   flag_hhk = FALSE;
           hb_retl (TRUE);           
       }
       else
           hb_retl (FALSE);   
   }
   else
      hb_retl (TRUE);     
}

#pragma enddump
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

"ON KEY" para todo sistema

Mensagempor casesistemas » 09 Dez 2013 21:13

Boa Noite

Que coisa heim ? Isto é simples de fazer em Clipper.

Vou testar e tentar encaixar a dica do Claudio.

Agradeço pelas respostas

Att

João Carlos
CASE Sistemas
casesistemas
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 31
Data de registro: 04 Ago 2004 16:50
Cidade/Estado: Campinas/SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro