secondsen 发表于 2012-10-31 22:32:55

AllocConsole关闭就退出进程,怎么办啊?

RT。。。。我希望点击AllocConsole的命令行窗口的 “X”按钮执行FreeConsole而不是退出进程,这应该怎么办啊?


    if (AllocConsole())
    {
      SetConsoleTitleA("Debug Window");
      freopen("CONOUT$","w+t",stdout);
      freopen("CONIN$","r+t",stdin);

shawind 发表于 2012-11-1 14:48:22

allocconsole创建出来的,不是一般的窗口,很难为其单独处理消息循环,你可以取了其句柄后操作它试试。
codeproject上都是提供的最简单暴力的作法:

AllocConsole();
HWND console_hwnd = GetConsoleWindow();
HMENU hmenu = GetSystemMenu(console_hwnd, FALSE);
DeleteMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);

secondsen 发表于 2012-11-1 15:02:26

这个方法我也找到了,但是太暴力了,我想把关闭变成freeconsole

shawind 发表于 2012-11-1 17:26:14

用SetWindowLong为console窗口指定新的消息函数不知道行不行。

再不然就用hook吧。

secondsen 发表于 2012-11-2 15:33:58

我这个钩子有什么问题哇??点击最小化按钮,也没有弹出对话框啊。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);
}

shawind 发表于 2012-11-2 22:10:16

呵呵,不知道是怎么回事呢。ms的console很特殊。

还有别的方法:

1.用CreateProcess单独运行一个console进程,再用AttachConsole把主进程附加到console进程。

2.还可以开个单独的GUI窗口,把console嵌进去。

3.其实更常见的作法是把调试信息写入一个log文件里去,虽然不直观,但是hge,sdl,irrlicht,glfw...几乎绝大多数游戏引擎都是这么干的。

secondsen 发表于 2012-11-2 23:24:14

log我做了来着,就是想弄个命令行出来。但是就出现这个毛病了。。。OTZ。。。。我去看看1、2、都是什么。。。MS今天google找到attachConsole,但是没有仔细看。。。2那个我看看怎么做先

lw 发表于 2012-11-4 20:31:38

Console的话就是直观些,

好像需要用的是CONSOLE的API,你可以看看SIGNAL相关的(WINDOWS也有SIGNAL,好像是sig_exit还是sig_terminal的)

之后挂接防止退出也许可以?
页: [1]
查看完整版本: AllocConsole关闭就退出进程,怎么办啊?