2012-05-03 94 views
1

繼承人一個簡單的問題CTRL + BREAK - 反正是有一個非控制檯(即CWinApp的)應用程序可以接收和處理CTRL + BREAK,它會出現SetConsoleCtrlHandler沒有做的工作也不安裝信號處理程序?捕獲在Windows應用程序

我遺憾的是我與被微軟HPC的控制下運行的遺留CDialog的基於應用程序的工作和HPC使用CTRL + BREAK取消程序(假設我想,沒有人在他們的腦子就會有非控制檯應用程序在後臺運行)

乾杯。

+0

HPC試圖取消該程序時發生了什麼?程序無法停止,或者沒有首先調用處理程序就會停止? –

+0

如果在應用程序中從HPC運行時調用GetConsoleWindow,是否返回NULL? –

+0

是的,它返回NULL,所以看起來像我沉沒。當HPC取消程序,我假設它只是調用默認處理程序(並因此ExitProcess),因爲我的處理程序從來沒有被調用過程終止 – user1371314

回答

1

調用AttachConsoleATTACH_PARENT_PROCESS應該做的伎倆。這會將您的進程附加到HPC控制檯,以便它可以接收控制中斷信號。您應該在致電SetConsoleCtrlHandler之前執行此操作。

如果這不起作用,請嘗試使用AllocConsole。如果HPC沒有自己的控制檯,則可能假定子進程已經創建了新的控制檯組(這對於控制檯模式應用程序會自動發生),在這種情況下,它將發送控制中斷信號到子過程PID。如果是這樣,控制檯組是自動創建還是顯式創建應該沒有關係。

您可能希望通過確保HPC確實通過檢查SetConsoleCtrlHandler作品如預期的控制檯模式的應用程序發送控制中斷信號(可能通過GenerateConsoleCtrlEvent)開始。如果它正在調用TerminateProcess,那麼您無法對此做任何事情。

+0

感謝哈利AttachConsole工程。 – user1371314

相關問題