Página 1 de 1

"ON KEY" para todo sistema

Enviado: 02 Dez 2013 18:59
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

"ON KEY" para todo sistema

Enviado: 02 Dez 2013 19:10
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.

"ON KEY" para todo sistema

Enviado: 07 Dez 2013 19:20
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.

"ON KEY" para todo sistema

Enviado: 07 Dez 2013 22:04
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,

"ON KEY" para todo sistema

Enviado: 07 Dez 2013 23:48
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;

"ON KEY" para todo sistema

Enviado: 08 Dez 2013 11:49
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 ! :)

"ON KEY" para todo sistema

Enviado: 08 Dez 2013 13:18
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

"ON KEY" para todo sistema

Enviado: 09 Dez 2013 22:13
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