"ON KEY" para todo sistema

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

casesistemas
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 04 Ago 2004 16:50
Localização: Campinas/SP
Contato:

"ON KEY" para todo sistema

Mensagem por casesistemas »

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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

"ON KEY" para todo sistema

Mensagem por alxsts »

Olá!

Talvez este código possa te dar alguma ideia.

Código: Selecionar todos

/*
* 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)
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

"ON KEY" para todo sistema

Mensagem por Claudio Soto »

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 do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

"ON KEY" para todo sistema

Mensagem por Toledo »

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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

"ON KEY" para todo sistema

Mensagem por alxsts »

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)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

"ON KEY" para todo sistema

Mensagem por Pablo César »

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.
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

"ON KEY" para todo sistema

Mensagem por Claudio Soto »

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

Código: Selecionar todos

****************************************************************************
* 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
casesistemas
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 04 Ago 2004 16:50
Localização: Campinas/SP
Contato:

"ON KEY" para todo sistema

Mensagem por casesistemas »

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
Responder