SetConsoleCtrlHandler() et CIN

Résolu
mystercoco Messages postés 7 Date d'inscription dimanche 11 juin 2006 Statut Membre Dernière intervention 25 novembre 2007 - 10 oct. 2007 à 13:50
mystercoco Messages postés 7 Date d'inscription dimanche 11 juin 2006 Statut Membre Dernière intervention 25 novembre 2007 - 15 oct. 2007 à 19:26
Bonjour,
je développe un programme en ligne de commande, pour empecher l'utilisateur d'appuyer sur CTRL-C, j'utilise SetConsoleCtrlHandler() qui récupére CTRL_C_EVENT.
L'évenement est bien capté par le programme, mais le fichier stdin est fermé lors de la combinaison CTRL-C.
Il m'est donc impossible de récupérer des entrées claviers delors qu'un ctrl-c est effectué, j'aimerais que cette combinaison soit tout simplement anhilé.

Voici le bout de code :
BOOL CtrlHandler(DWORD action)
{ 
if (action==CTRL_C_EVENT ||action==CTRL_BREAK_EVENT)
{
char buf[50];
if (!(std::cin>>buf))
std::cout<<"erreur cin";
         }
return TRUE;
}

Dans le main :
SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);


erreur cin est afficher lors du CTRL-C.

Merci

1 réponse

mystercoco Messages postés 7 Date d'inscription dimanche 11 juin 2006 Statut Membre Dernière intervention 25 novembre 2007
15 oct. 2007 à 19:26
Le problème a été résolu grace à la méthode SetConsoleMode() plutot que SetConsoleCtrlHandler().
En effet cette dernière envoyée le signal lorsqu'il était trop tard (close signal).

Voici une classe que j'ai écrit qui permet de simplifier les saisi claviers de ctrl...


#include 
#include <string>
#include <windows.h>

class hardio //class inline d'entrée de données
{
private:
DWORD mode; //mode initial
DWORD nmode; //mode modifié
HANDLE console; //Handle de la console
char test[BUFSIZ]; //tampon mémoire
DWORD bufs; //nombre de caractères lu

public:
hardio() 
{
static int instance=0;
if (instance>0)
throw "Instance multiple"; //on interdit les instances multiples
else
instance++;
console=GetStdHandle(STD_INPUT_HANDLE); //on récupère le HANDLE
GetConsoleMode (console, &mode); //on récupère le mode
nmode=mode & ~ENABLE_PROCESSED_INPUT; //on calcul le nouveau mode
}

~hardio()
{
SetConsoleMode (console,mode); //remise à défaut du mode;
}

friend std::string operator >> (hardio h, std::string& s)
{
SetConsoleMode (h.console, h.nmode); //on change le mode console
ReadConsole(h.console,h.test,BUFSIZ,&(h.bufs),NULL); //on charge le buffer clavier
std::cout<<char(10)<<char(13); //on dessend et on revient à la ligne
SetConsoleMode (h.console, h.mode); //on revient à l'ancien mode console 
s=""; //initialisation du string (ecrase l'ancienne valeur)
for (int i=0;i<2*(int(h.bufs)-1);i=i+2) //pas de 2, structure "caractère+espace"
s+=h.test[i]; //ajout au string du caractère
return s; //renvoie du string
}

};


A utiliser comme suit :

hardio cin; //une seule fois dans tout le code
std::string chaine;
cin>>chaine;


ps: merci pour la réponse mais je suis parti sur une autre piste (l'erreur étant un peu inhabituelle)
3
Rejoignez-nous