2011-12-22 66 views
4

我有一個在Windows CE 6.0中運行的Win32 C++控制檯應用程序,它包含許多連續運行的線程。偶爾需要停止應用程序,我希望以受控方式進行。這樣做的一種方法是簡單地監視控制檯窗口,如果它關閉,則停止該過程。不幸的是,SetConsoleCtrlHandler似乎不是Windows CE 6.0的Win32 API的一部分。有誰知道我可以檢測到控制檯在運行在CE中的Win32 C++程序中關閉了嗎?如何在Windows CE中處理控制檯關閉?

感謝,

回答

0

你可以通過調用DeviceIoControlIOCTL_CONSOLE_SETCONTROLCHANDLER監視按Ctrl-C。 hDevice參數使用_fileno(stdout)

我不認爲有任何方法可以通知任何其他「關閉」機制。

+0

我認爲IOCTL_CONSOLE_SETCONTROLCHANDLER是一個.Net調用。這是從Win32應用程序提供的嗎? – 2011-12-22 20:31:13

+0

應該工作,看看這裏:http://stackoverflow.com/questions/1366879/how-can-i-handle-ctrlc-in-a-windows-ce-console-application – marcinj 2011-12-28 16:29:18

+0

這是最defintely *不*一個.NET調用 - 這是您發送給DeviceIoControl的IOCTL值,它是一個純Win32 API調用。 – ctacke 2011-12-28 18:31:40

0

我在Windows Embedded Compact 7上使用了這個工具。Ctrl + C和「窗口關閉」事件都被捕獲。

  1. 創建一個Win32事件。
  2. 使用IOCTL_CONSOLE_SETCONTROLCEVENT將該事件傳遞給DeviceIoControl(),並給予控制檯句柄(例如_fileno(stdout))。當鍵入Ctrl + C或控制檯窗口關閉時,該事件將發出信號。
  3. 創建一個線程,等待Win32事件發出信號,當它變成如此時,調用您的Ctrl + C處理程序或執行清理,並可能退出程序。

請注意,IOCTL_CONSOLE_SETCONTROLCHANDLER已被棄用,並且在給定該IOCTL代碼時DeviceIoControl()失敗。