Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-11-2005
Mastropiero Mastropiero is offline
Registrado
 
Registrado: nov 2005
Posts: 4
Poder: 0
Mastropiero Va por buen camino
¿Cómo detecto CTRL+C en consola?

Hola,

pues eso. Estoy haciendo un programa en modo consola y necesito que cuando el usuario pulse CTRL+C o CTRL+Break, en lugar de salir del programa, llame a una función.

Conozco la forma tradicional escaneando el teclado con la INT16h, pero me gustaría saber si hay alguna forma más de alto nivel para hacerlo (capturando algún mensaje o algo así).


Gracias y un saludo.

Última edición por Mastropiero fecha: 08-11-2005 a las 11:26:29.
Responder Con Cita
  #2  
Antiguo 08-11-2005
Avatar de OSKR
OSKR OSKR is offline
Miembro
 
Registrado: nov 2004
Ubicación: San Cristóbal/Táchira/Venezuela
Posts: 389
Poder: 20
OSKR Va por buen camino
MMMMMMMMmmmmmmhhhhhhh......bueno............!!! yo recuerdo q cuando usaba Turbo C o Turbo C++ habia una función llamada CtrlBrk si mas no recuerdo, y modificaba el vector de interrupciones para esa interrupcion valga la redundancia capturandola y ejecutando la función señalada y definida por nosotros, pero creo q para Win32 ya no exista, la otra q veo es q mantengas el uso de interrupciones. Tal vez no te pude ayudar pero al menos tienes un indicio de por donde buscar.
__________________
Los Estados Unidos parecen destinados por la Providencia para plagar la América de miserias a nombre de la libertad."
Simón Bolívar
(Carta al Coronel Inglés Patricio Cambell 05/08/1829).
Responder Con Cita
  #3  
Antiguo 08-11-2005
Mastropiero Mastropiero is offline
Registrado
 
Registrado: nov 2005
Posts: 4
Poder: 0
Mastropiero Va por buen camino
¡Gracias!

Parece que es algo del DOS puro, pero miraré a ver si existe algo equivalente.

Realmente desconocía esa función ya que en aquella época yo llamaba a la INT a "caraperro".

Investigaré por esa línea.

Gracias y un saludo.
Responder Con Cita
  #4  
Antiguo 05-02-2008
Mastropiero Mastropiero is offline
Registrado
 
Registrado: nov 2005
Posts: 4
Poder: 0
Mastropiero Va por buen camino
Buenas, han pasado dos años y me olvidé de este hilo, pero como creo que puede ser útil para alguien, posteo la solución que encontré en su momento:

Cualquier aplicación (sea consola o gui) que use la unidad SysUtils, levanta una excepción llamada EControlC cuando CTRL+C es pulsado.

Así que lo único que hay que hacer es capturar excepciones en la parte del programa que queremos detectar la interrupción por CTRL+C, y manejar la excepción EControlC a nuestro antojo.

Saludos!
Responder Con Cita
  #5  
Antiguo 06-02-2008
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Wenas.

Sólo decir que he estado haciendo pruebas en Linux (Free Pascal) y no funciona. Compila y ejecuta, pero al pulsar [Ctrl+C] cierra el programa y ya está. El programa que he utilizado es este:
Código Delphi [-]
PROGRAM EjemploControlC; 
(* Un ejemplo de cómo capturar [Ctrl+C] con Object Pascal.  *) 
 
{ FPC no necesita saber si es o no de consola. }
USES 
  SysUtils; { EControlC es declarada aquí. } 
 
VAR 
  VariableTonta: STRING; 
BEGIN 
  TRY 
    WriteLN ('Para terminar puedes pulsar [Enter] o [Ctrl+C].  El resultado será diferente en cada caso'); 
    ReadLN (VariableTonta); 
    WriteLN ('Has pulsado [Enter].'); 
  EXCEPT 
    ON EControlC DO WriteLN ('Has pulsado [Ctrl+C].'); 
  END; 
  WriteLN ('Que tengas un buen día.'); 
END.
Sólo lo digo para que conste, no porque crea que esté mal que no es el caso.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #6  
Antiguo 06-02-2008
Mastropiero Mastropiero is offline
Registrado
 
Registrado: nov 2005
Posts: 4
Poder: 0
Mastropiero Va por buen camino
Cita:
Empezado por Ñuño Martínez Ver Mensaje
Wenas.

Sólo decir que he estado haciendo pruebas en Linux (Free Pascal) y no funciona. Compila y ejecuta, pero al pulsar [Ctrl+C] cierra el programa y ya está. El programa que he utilizado es este:
¿Lo has probado abriendo el ejecutable ya compilado, o sólo desde el IDE?

Lo digo por si en las opciones del debugger o de projecto hay alguna opción que esté inhibiendo el manejo de excepciones del OS.

Yo en su momento lo hice funcionar (Delphi 7 sobre Windows 98), aunque no lo he vuelto a probar desde entonces en XP.

Saludos.
Responder Con Cita
  #7  
Antiguo 06-02-2008
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por Mastropiero Ver Mensaje
¿Lo has probado abriendo el ejecutable ya compilado, o sólo desde el IDE?
Lo he probado de varias formas.

Por cierto, que lo he consultado en la lista de correos de Free Pascal y me han dicho que en Linux no funciona. Para ello hay que utilizar un "signal handler" . No lo tengo claro porque el mensaje ha llegado corrupto y no lo he podido leer bien.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #8  
Antiguo 06-02-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Debes revisar la API SetConsoleCtrlHandler

Código Delphi [-]
uses SysUtils, Windows; {$apptype console}
 
function HandlerRoutine(dwCtrlType: Cardinal): LongBool;
begin
 if dwCtrlType = CTRL_C_EVENT then Halt;
end;
 
begin
 SetConsoleCtrlHandler(@HandlerRoutine, True);
 WriteLn('Pulsa Ctrl+C para salir');
 while True do ReadLn;
end.
Responder Con Cita
  #9  
Antiguo 07-02-2008
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Gracias [ChackAll]
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:26:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi