Página 1 de 2

X da janela é um Evento?

Enviado: 13 Jun 2014 17:38
por Maurício Elias
Olá, boa tarde pessoal.
Tem como tratar o X da janela do Sistema (HB32 Console) um Evento e fazer com que ele execute o "Close Data" ao clicarem ?
Obrigado.

X da janela é um Evento?

Enviado: 14 Jun 2014 18:45
por zazibr
se vc nao usa nenhum modo grafico gtwvw ou gtwvh nao vai conseguir tratar isso

X da janela é um Evento?

Enviado: 14 Jun 2014 21:31
por Maurício Elias
... é, ainda não uso não.
O jeito vai ser esperar a vez então !!!
Valew colega.

X da janela é um Evento?

Enviado: 16 Jun 2014 08:23
por bencz
Bom, é possivel sim, como a idéa principal do windows é, ser sempre orientado a eventos... entao, é simplesmente possivel, e não é complexo de se fazer...
bastando conhecer algumas coisas basicas da API do windows teremos algumas funções como:

Código: Selecionar todos

HandlerRoutine

Código: Selecionar todos

SetConsoleCtrlHandler
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
http://msdn.microsoft.com/query/dev10.q ... 29&rd=true

Bastando implementar as funções, da forma correta no

Código: Selecionar todos

#pragma
do seu codigo em hb, e pronto, tudo vai funcionar como vc deseja!

http://www.codeproject.com/Articles/235 ... t-Handling

--------------------------------------------------
Veja este código de exemplo:

Código: Selecionar todos

#include <stdio.h>
#include <windows.h>

BOOL WINAPI closeHandler(DWORD Evento)
{
	switch (Evento)
	{
	case CTRL_CLOSE_EVENT:
		MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
		break;
	}
	return TRUE;
}

int main()
{
	int counter = 0;
	SetConsoleCtrlHandler(closeHandler, true);

	for (;;)
	{
		printf("oi %d\n", counter);
		counter++;
	}
}
--------------------------------------------------------------------------------------------------
Uma implementação aproximada no Harbour

Código: Selecionar todos

function start()
  CTRL_HANDLE_CONSOLE()
  
  for i:=1 to 1000000000
    ? "oi"
  next
return nil

#pragma BEGINDUMP

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

int WINAPI closeHandler(DWORD Evento)
{
	switch (Evento)
	{
	case CTRL_CLOSE_EVENT:
    MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
		return 0;
		break;
	}
	return 1;
}

HB_FUNC( CTRL_HANDLE_CONSOLE )
{
  SetConsoleCtrlHandler(closeHandler, 1);
}

#pragma ENDDUMP

X da janela é um Evento?

Enviado: 16 Jun 2014 16:29
por Maurício Elias
Olá Bencz, boa tarde. Obrigado pela ajuda.
Estou saindo agora do Dosão, nunca tive contato com uma API. Olhei os Links, entendi que HandlerRoutine e SetConsoleCtrlHandler seriam 2 APIs, certo ?
#pragma ??? Não consegui entender.
BOOL WINAPI closeHandler () executa a API, é isso ?
Depois vem Int Main(). Seria meu Function Main ?
Vou tentar, mas sei não se dou conta... E tudo em inglês!
Valew...

X da janela é um Evento?

Enviado: 16 Jun 2014 16:51
por bencz
andlerRoutine e SetConsoleCtrlHandler seriam 2 APIs, certo ?
Sim, eles pertencem a API( application programming interface ) do windows.
O comando #pragma permite que o programador diga ao compilador para fazer certas coisas. Uma vez que o comando #pragma é específico da implementação, os seus usos variam de compilador para compilador. Uma opção possível é traçar a execução do programa.
http://pt.cppreference.com/w/cpp/preprocessor/pragma
No caso, utilizo o comando de pre-processamento, #pragma, para dizer ao compilador que daquele ponto, #pragma begindump até o #pragma enddump vai ser código nativo C
BOOL WINAPI closeHandler () executa a API, é isso ?
está é uma função que é executada a cada evento que ocorrer no console, eu poderia ter dado qualquer nome a ela...
Depois vem Int Main(). Seria meu Function Main ?
Sim, essa é a entrada do programa.

X da janela é um Evento?

Enviado: 16 Jun 2014 17:05
por Maurício Elias
Cara, que loucura, C nativo no HB32 ???
Vou tentar implementar a noite.
Mas em qual linha é acionada qual função no Clique do X do Windows?

X da janela é um Evento?

Enviado: 16 Jun 2014 17:27
por bencz
Utilizar C com Hb não é nada de mais, pois o processo de compilação do harbour, simplesmente converte o seu código xBase em C, e depois chama um compilador em C para compilar o código gerado pelo compilador Harbour.
Mas em qual linha é acionada qual função no Clique do X do Windows?
Neste trecho do código, dentro do case...

Código: Selecionar todos

04	BOOL WINAPI closeHandler(DWORD Evento)
05	{
06	   switch (Evento)
07	   {
08	   case CTRL_CLOSE_EVENT:
09	      MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
10	      break;
11	   }
12	   return TRUE;
13	}

X da janela é um Evento?

Enviado: 18 Jun 2014 00:40
por cjp
Que excelente solução. Meus parabéns.

Faço duas perguntas:

1) É possível também impedir o fechamento no X? Sei de função que desabilita o X da janela, mas ela não impede que o usuário clique na opção de fechar a janela na própria barra de tarefas.

2) Tem como executar uma função normal do Harbour de dentro da função C compilada junto? Estou tentando simplesmente chamar a função assim: minha_função(), mas dá erro na compilação

X da janela é um Evento?

Enviado: 18 Jun 2014 09:55
por bencz
1) É possível também impedir o fechamento no X? Sei de função que desabilita o X da janela, mas ela não impede que o usuário clique na opção de fechar a janela na própria barra de tarefas.
Até onde eu saiba, não tem como....
2) Tem como executar uma função normal do Harbour de dentro da função C compilada junto? Estou tentando simplesmente chamar a função assim: minha_função(), mas dá erro na compilação
Tem sim, é muito simples, veja o anexo.

X da janela é um Evento?

Enviado: 18 Jun 2014 10:13
por Nascimento
amiguinho a pergunta

1º se for em modo console faz facilmente com a gtwvt

X da janela é um Evento?

Enviado: 18 Jun 2014 10:13
por bencz
para esclarecer melhor...
Veja o código abaixo...

Código: Selecionar todos

function start()
  CTRL_HANDLE_CONSOLE()
  
  inkey(10)
  
  for i:=1 to 1000000000
    ? "oi"
  next
return nil

function minha_funcao()
  QOut("Ola mundo, da minha funcao")
return nil

#pragma BEGINDUMP

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

HB_FUNC_EXTERN( MINHA_FUNCAO );  // define como função externa

int WINAPI closeHandler(DWORD Evento)
{
	switch (Evento)
	{
	case CTRL_CLOSE_EVENT:
    MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
		return 0;
	}
	return 1;
}

HB_FUNC( CTRL_HANDLE_CONSOLE )
{
  HB_FUNC_EXEC( MINHA_FUNCAO );   // chamada da função HARBOUR
  SetConsoleCtrlHandler(closeHandler, 1);
}

#pragma ENDDUMP

X da janela é um Evento?

Enviado: 19 Jun 2014 00:39
por cjp
Bencz, salvo se eu estiver fazendo algo errado, creio que não funcionou como eu imaginava. Ele está executando a minha_funcao no início do programa, mas não quando clico no X.

Josivan, sim, eu uso apenas modo console. Como fazer isso com gtwvt?

X da janela é um Evento?

Enviado: 19 Jun 2014 12:15
por Nascimento
Fiz um mini exemplo mais da pra vc entender
segue o codigo abaixo

Código: Selecionar todos

/* 
TESTE DE USO SIMPLES DE ATIVAR OU DESATIVAR O X DA JANELA
COMPILAR COM HBMK2 DEMO.PRG -GUI -GTWVT
*/

#include 'inkey.ch'
#include 'hbgtinfo.ch'


function main()

hb_gtInfo( HB_GTI_CLOSABLE,.f.) // inibe o fechamento no X da janela
setcursor(0)
cls
?'TESTE PARA FECHAMENTO DE JANELA'
while .t.

 tk:= inkey(0,128 + HB_INKEY_GTEVENT) 
  
  if (lastkey() == HB_K_CLOSE)
    if alert('Deseja fechar o sistema ? ',{'Sim','Nao'}) == 1
      exit
    endif
  endif
end   

X da janela é um Evento?

Enviado: 20 Jun 2014 08:43
por bencz
vc está fazendo errado, preste mais atenção no meu código...., veja o meu exemplo...

Código: Selecionar todos

#include "inkey.ch"

function main()
  CTRL_HANDLE_CONSOLE()
  
  IF FILE("cliente.dbf") == .F.
    aDB := { { "Codigo", "N", 3, 0 }, { "Nome", "C", 50, 0 } }
    DbCreate( "clientes", aDB )
  ENDIF
  
  USE Clientes EXCLUSIVE NEW
  
  while .t.
    tk := inkey(0,INKEY_ALL)
    if tk==27 .and. nextkey()==0
        minha_funcao()
    endif
  end
return nil

function minha_funcao()
  ? "Fechando tudoooo!!!"
  CLOSE ALL
  QUIT
return nil

#pragma BEGINDUMP

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

HB_FUNC_EXTERN( MINHA_FUNCAO );  // define como função externa

int WINAPI closeHandler(DWORD Evento)
{
	switch (Evento)
	{
	case CTRL_CLOSE_EVENT:
    MessageBox(NULL, "Vc clicou no X", "Eba Oba!!", MB_OK);
    HB_FUNC_EXEC( MINHA_FUNCAO );   // chamada da função HARBOUR
		return 0;
	}
	return 1;
}

HB_FUNC( CTRL_HANDLE_CONSOLE )
{
  SetConsoleCtrlHandler(closeHandler, 1);
}

#pragma ENDDUMP