IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

windows.h SetConsoleCtrlHandler et CIN


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut [résolu] windows.h SetConsoleCtrlHandler et CIN
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);
    erreur cin est afficher lors du CTRL-C.

    Merci

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    UP ^^^^

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    1. Vérifie que stdin lui-même est fermé. Là, tout ce qu'on voit, c'est que cin foire.
    2. Tu peux essayer de réouvrir la console sur stdin, aver un freopen() et le fichier "CONIN$".
    3. Supprime ton cast en (PHANDLER_ROUTINE). Lis la citation de ma signature si tu ne comprends pas pourquoi.
    4. Ta fonction ne devrait retourner TRUE que pour les cas qu'elle gère, pas systématiquement.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    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...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <iostream>
    #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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    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)

Discussions similaires

  1. [Windows]accès base de registre windows
    Par Greg01 dans le forum API standards et tierces
    Réponses: 27
    Dernier message: 05/06/2007, 15h14
  2. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  3. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  4. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45
  5. Quel désassembleur/assembleur pour un exe Windows ?
    Par Anonymous dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 17/04/2002, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo