2009-09-02 9 views
3

Мне нужно сделать некоторые очистки до закрытия моего приложения, но SetConsoleCtrlHandler, похоже, не доступен для консольных приложений Windows CE.Как я могу обработать Ctrl + C в консольном приложении Windows CE?

Есть ли альтернативный метод обработки Ctrl+C в Windows CE 6?

+0

Любой шанс, что вы можете пойти с подходом «отключение» Control + C от убийства вашего приложения? Этот элемент управления ввода-вывода может сделать трюк для этого: http://msdn.microsoft.com/en-us/library/aa931517.aspx. – reuben

+0

Спасибо, но мне нужно сделать очистку перед закрытием приложения, чтобы не допустить, чтобы приложение было убито. –

ответ

5

В соответствии с документацией Microsoft, в Windows CE 3.0 и выше, функция DeviceIoControl, вызываемая с помощью управляющего кода IOCTL_CONSOLE_SETCONTROLCHANDLER, установит обработчик Ctrl + C в Windows CE. Я не пробовал это сам еще, но что-то вроде этого «должны» работы:

DWORD ignore; 
DeviceIoControl(
    _fileno(stdout),     // handle to the console 
    IOCTL_CONSOLE_SETCONTROLCHANDLER, // Tell Win CE to set the console Ctrl+C handler 
    (LPVOID)consoleHandler,    // pointer to the signal handler 
    sizeof(consoleHandler),    // size of the pointer 
    NULL,        // output buffer not needed 
    0,         // zero output buffer size 
    &ignore,       // no data will be put into the output buffer so we don't need its size 
    NULL);        // not an asynchronous operation - don't need to provide async info 

где consoleHandler, конечно, ваш обработчик Ctrl + C.

Документы:

заголовков необходимы:

  • Console.h
  • winbase.h (как правило, включены т hrough windows.h).
0

У меня это работает на Windows Embedded Compact 7. Заключительные события Ctrl + C и «окна закрыты».

  1. Создайте событие Win32.
  2. Передайте это событие DeviceIoControl() с помощью IOCTL_CONSOLE_SETCONTROLCEVENT и передайте дескриптор консоли (например, _fileno (stdout)). Это событие будет сигнализироваться при вводе Ctrl + C или закрытие окна консоли.
  3. Создайте поток, который ждет, когда событие Win32 станет сигналом, и когда оно станет таким, вызывает ваш обработчик Ctrl + C или выполняет очистку и, вероятно, выходит из программы.

Обратите внимание, что IOCTL_CONSOLE_SETCONTROLCHANDLER устарел, а DeviceIoControl() терпит неудачу, если ему задан этот код IOCTL.