如何在Windows CE控制台应用程序中处理Ctrl + C?

时间:2009-09-02 10:19:52

标签: winapi console signals windows-ce

我需要在关闭应用程序之前进行一些清理,但是SetConsoleCtrlHandler似乎不适用于Windows CE控制台应用程序。

在Windows CE 6中是否有处理Ctrl+C的替代方法?

2 个答案:

答案 0 :(得分:5)

根据Microsoft的文档,在Windows CE 3.0及更高版本中,使用DeviceIoControl控件代码调用的IOCTL_CONSOLE_SETCONTROLCHANDLER函数将在Windows CE上安装Ctrl + C处理程序。我还没有尝试过,但是这样的“应该”有效:

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(通常包含在windows.h中)。

答案 1 :(得分:0)

我在Windows Embedded Compact 7上工作了.Ctrl + C和"窗口关闭"事件都被抓住了。

  1. 创建Win32事件。
  2. 使用IOCTL_CONSOLE_SETCONTROLCEVENT将该事件传递给DeviceIoControl(),并给出控制台句柄(例如,_fileno(stdout))。当键入Ctrl + C或控制台窗口关闭时,将发出该事件的信号。
  3. 创建一个等待Win32事件发出信号的线程,当它变为信号时,调用你的Ctrl + C处理程序或执行清理,并可能退出程序。
  4. 请注意,IOCTL_CONSOLE_SETCONTROLCHANDLER已被弃用,而且当给出IOCTL代码时,DeviceIoControl()会失败。