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:
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
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