我正在尝试从我的主程序(Win32)打开控制台。我找到了一些代码,但它确实有效,但我不明白。我遇到的问题是,当我在控制台上单击X时,它也会关闭程序。
我大概有这个:
int APIENTRY WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) {
// create the main program window, classes registered, etc...
hwnd = CreateWindowEx(0, csClassName, "theNewTimer", WS_POPUP | WS_CLIPCHILDREN, 300, 0, WINDOW_WIDTH, WINDOW_HEIGHT, HWND_DESKTOP, NULL, hThisInstance, NULL);
ShowWindow (hwnd, nFunsterStil);
// and now the console
AllocConsole();
HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
int hCrt = _open_osfhandle((long) handle_out, _O_TEXT);
FILE* hf_out = _fdopen(hCrt, "w");
setvbuf(hf_out, NULL, _IONBF, 1);
*stdout = *hf_out;
HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
hCrt = _open_osfhandle((long) handle_in, _O_TEXT);
FILE* hf_in = _fdopen(hCrt, "r");
setvbuf(hf_in, NULL, _IONBF, 128);
*stdin = *hf_in;
// and then the message loop concluding
我用谷歌搜索了一些,但不知道我在读什么。
答案 0 :(得分:5)
您可以做的一件事是禁用控制台窗口上的关闭按钮:
HWND hwnd = ::GetConsoleWindow();
if (hwnd != NULL)
{
HMENU hMenu = ::GetSystemMenu(hwnd, FALSE);
if (hMenu != NULL) DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
}
答案 1 :(得分:3)
我不认为这是可能的。在HandlerRoutine
的MSDN文档中,有这句话。
CTRL_CLOSE_EVENT , CTRL_LOGOFF_EVENT 和 CTRL_SHUTDOWN_EVENT 信号为流程提供了在终止前清理的机会。
我读到这句话时说 CTRL_CLOSE_EVENT 是建议性的,并且无论如何都会退出该进程。我的猜测是,当系统发送 CTRL_CLOSE_EVENT 时,它会启动一个计时器。允许该进程保持运行一段时间,但最终,操作系统将单方面杀死该进程。
这是我注册的处理程序
BOOL WINAPI ConsoleCtrlHandler(DWORD dwCtrlType) {
switch (dwCtrlType) {
case CTRL_C_EVENT:
case CTRL_CLOSE_EVENT:
return TRUE; // breakpoint set here
default:
return FALSE;
}
}
以下是我在致电AllocConsole
之后注册处理程序的方式:
BOOL result = SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE /* Add */);
assert(result);
我在标有//breakpoint set here
的行上设置断点。然后,我在Visual Studio调试器下运行该过程。控制台窗口聚焦后,我按下Ctrl + C.我的断点被击中,我能够通过我的处理程序并返回KernelBase.dll!CtrlRoutine
,依此类推。当我让进程恢复正常执行时,进程一直在运行。
然而,当我关闭控制台窗口时,我的处理程序确实被调用了,但是我无法跟踪它的执行情况。我能够单步执行几次,但随后只需退出该过程。 Visual Studio报告“程序'[10644] Win32Project.exe已退出,代码为-1073741510(0xc000013a)。”
0xc000013a是STATUS_CONTROL_C_EXIT:
c:\Tools\ERR>Err.exe 0xc000013a
# for hex 0xc000013a / decimal -1073741510 :
STATUS_CONTROL_C_EXIT ntstatus.h
# {Application Exit by CTRL+C}
# The application terminated as a result of a CTRL+C.
# 1 matches found for "0xc000013a"