AllocConsole关闭就退出进程,怎么办啊?
RT。。。。我希望点击AllocConsole的命令行窗口的 “X”按钮执行FreeConsole而不是退出进程,这应该怎么办啊?if (AllocConsole())
{
SetConsoleTitleA("Debug Window");
freopen("CONOUT$","w+t",stdout);
freopen("CONIN$","r+t",stdin); allocconsole创建出来的,不是一般的窗口,很难为其单独处理消息循环,你可以取了其句柄后操作它试试。
codeproject上都是提供的最简单暴力的作法:
AllocConsole();
HWND console_hwnd = GetConsoleWindow();
HMENU hmenu = GetSystemMenu(console_hwnd, FALSE);
DeleteMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);
这个方法我也找到了,但是太暴力了,我想把关闭变成freeconsole 用SetWindowLong为console窗口指定新的消息函数不知道行不行。
再不然就用hook吧。 我这个钩子有什么问题哇??点击最小化按钮,也没有弹出对话框啊。T_T
if (AllocConsole())
{
hHook = SetWindowsHookEx(WH_CALLWNDPROC, HookProc, 0, GetCurrentThreadId());
if (hHook == NULL)
{
MessageBoxA(0, "Console Created Failed.", "Error!", MB_OK);
FreeConsole();
return 0;
}
SetConsoleTitleA("Debug Window");
freopen("CONOUT$","w+t",stdout);
freopen("CONIN$","r+t",stdin);
cout << DebugInfo;
uiState ^= 1;
return 1;
}
LRESULT CALLBACK DebugRecord::HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPCWPSTRUCT lpmsg= (LPCWPSTRUCT)lParam;
if(nCode == HC_ACTION && !wParam)
{
if(lpmsg->hwnd == GetConsoleWindow())
{
stringstream ss;
ss << lpmsg->message;
string s;
ss >> s;
MessageBoxA(0, s.c_str(), "HOOK", MB_OK);
}
//if(lpmsg->message == WM_COMMAND)
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
} 呵呵,不知道是怎么回事呢。ms的console很特殊。
还有别的方法:
1.用CreateProcess单独运行一个console进程,再用AttachConsole把主进程附加到console进程。
2.还可以开个单独的GUI窗口,把console嵌进去。
3.其实更常见的作法是把调试信息写入一个log文件里去,虽然不直观,但是hge,sdl,irrlicht,glfw...几乎绝大多数游戏引擎都是这么干的。 log我做了来着,就是想弄个命令行出来。但是就出现这个毛病了。。。OTZ。。。。我去看看1、2、都是什么。。。MS今天google找到attachConsole,但是没有仔细看。。。2那个我看看怎么做先 Console的话就是直观些,
好像需要用的是CONSOLE的API,你可以看看SIGNAL相关的(WINDOWS也有SIGNAL,好像是sig_exit还是sig_terminal的)
之后挂接防止退出也许可以?
页:
[1]