Bloccare solo ctrl-c

di il
4 risposte

Bloccare solo ctrl-c

Salve a tutti vorrei realizzare una routine che mi annulli solo la sequenza di ctrl-c e non pure quella di ctrl-pausa/break cioè che non mi blocchi il programma in esecuzione.
lasciando però la sequenza ctrl-pausa invariata.
mi sto studiando la funzione SetConsoleCtrlHandler
ma sinceramente non ho capito i parametri!
PHANDLER_ROUTINE che cosa è e che valore dovrei metterci
handlerRoutine non ho capito se devo mettere un puntatore ad una routine o un valore che mi specifichi quale ctrl event voglio manipolare.
BOOL in questo caso so il valore false per disattivarlo
Add questo non l'ho proprio capito!
ringrazio anticipatamente chiunque mi sappia aiutare

4 Risposte

  • Re: Bloccare solo ctrl-c

    E' relativamente semplice ...
    
    #include <stdio.h> 
    #include <windows.h> 
     
    BOOL CHnd(DWORD CType) 
    { 
      if(CType == CTRL_C_EVENT) 
      { 
          printf("Hai usato Ctrl-C !\n");
          return(TRUE);
      } 
    
      return FALSE; 
    } 
     
    int main(void) 
    { 
      SetConsoleCtrlHandler((PHANDLER_ROUTINE)CHnd, TRUE);
      
      while(TRUE) ;
      
      return 0;
    }
    
    Il primo parametro è il puntatore alla funzione che tratterà gli eventi, il secondo indica se devi aggiungere il controllo degli eventi o lo devi eliminare.
  • Re: Bloccare solo ctrl-c

    Non va!
    ho provato il codice ma ho riscontrato 2 problemi:
    1)la sequenza ctrl-break/pausa non fa ciò che dovrebbe fare e come se fosse inibita.
    2)il programma resta sempre in attesa di qualcosa e non termina.
    come posso risolvere il problema ?
    questo è quello cheho scritto:
    #include "stdafx.h"
    #include <iostream>
    #include <windows.h>
    using namespace std;
    bool CHnd(DWORD CType);
    int _tmain(int argc, _TCHAR* argv[])
    {
    	SetConsoleCtrlHandler((PHANDLER_ROUTINE) CHnd,TRUE);
    // 3
    	while (TRUE);
    // 1
    	return 0;
    	
    }
    bool CHnd(DWORD CType)
    {
    	if (CType ==CTRL_C_EVENT)
    	{
    		printf("hai premuto Ctrl-C !\n");
    		return TRUE;
    	}
    // 2
    	return FALSE;
    } 
    ho provato a mettere un programmino di prova
    
    int a,b,c;
    		cout << "inserisci a : ";
    	cin >> a;
    		cout << "inserisci b: ";
    	cin >> b;
    	c=a+b; 
    	cout << "a+b = " << c << "\n";
    	c=a-b; 
    	cout << "a- b = " << c << "\n";
    return c;
    nel punto //1 il programmino non veniva mai eseguito
    //2 il programmino veniva eseguito solo dopo che premevo la seguenza ctrl-break
    //3 il programmino veniva eseguito ma se premevo la sequenza ctrl-c al primo input il messaggio viene visualizzato
    ma il programmino veniva terminato in modo anomalo
    i primi 2 casi riesco anche capirli ma il terzo mi è del tutto incomprensibile.
    se me lo spieghi mi fai un favore
    come posso risolvere il problema ?
  • Re: Bloccare solo ctrl-c

    smalldragon ha scritto:


    non va!
    Veramente va ...

    Il programma resta in attesa perché c'è una while infinita.
    Se usi Ctrl-C questa combinazione viene intercettata e il programma non termina, se usi Ctrl-Break il programma termina.
  • Re: Bloccare solo ctrl-c

    Ma se levo la while infinita
       while (TRUE);
    // 1
       return 0;
    il programma comunque mi termina in maniera anomala in caso di conbinazione ctrl-c.
    quello che vorrei fare invece e far si che quando si preme la combinazione ctrl-c faccia rieseguire l'ultima istruzione o tuttalpiù quella successiva.
    cosa che invece non sempre accade e comunque quando accade le istruzioni cin non vengono eseguite.

    nel programma di esempio
    SetConsoleCtrlHandler((PHANDLER_ROUTINE) CHnd,TRUE);
    int a,b,c;
          cout << "inserisci a : "; 
       cin >> a;                          // se premo qui ctrl-c 
          cout << "inserisci b: ";
       cin >> b;                       // questa istruzione non viene eseguita  (sempre se è stato premuto ctrl-c
       c=a+b;
       cout << "a+b = " << c << "\n";
       c=a-b;
       cout << "a- b = " << c << "\n";
    return c;
    come mai ha un comportamento del genere?
    e come posso porre rimedio?
Devi accedere o registrarti per scrivere nel forum
4 risposte