社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 道具中心
主题 : AllocConsole关闭就退出进程,怎么办啊?
secondsen 离线
级别: 总版主
显示用户信息 
0  发表于: 2012-10-31   
来源于 通用编程 分类

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

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


    if (AllocConsole())
    {
        SetConsoleTitleA("Debug Window");
        freopen("CONOUT$","w+t",stdout);
        freopen("CONIN$","r+t",stdin);
[ 此帖被secondsen在2012-10-31 22:45重新编辑 ]
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
相关话题
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
shawind 离线
级别: 分版主
显示用户信息 
1  发表于: 2012-11-01   
allocconsole创建出来的,不是一般的窗口,很难为其单独处理消息循环,你可以取了其句柄后操作它试试。
codeproject上都是提供的最简单暴力的作法:
复制代码
  1. AllocConsole();
  2. HWND console_hwnd = GetConsoleWindow();
  3. HMENU hmenu = GetSystemMenu(console_hwnd, FALSE);
  4. DeleteMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);
え~え~お!!!
secondsen 离线
级别: 总版主
显示用户信息 
2  发表于: 2012-11-01   
这个方法我也找到了,但是太暴力了,我想把关闭变成freeconsole
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
shawind 离线
级别: 分版主
显示用户信息 
3  发表于: 2012-11-01   
用SetWindowLong为console窗口指定新的消息函数不知道行不行。

再不然就用hook吧。
え~え~お!!!
secondsen 离线
级别: 总版主
显示用户信息 
4  发表于: 2012-11-02   
我这个钩子有什么问题哇??点击最小化按钮,也没有弹出对话框啊。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 离线
级别: 分版主
显示用户信息 
5  发表于: 2012-11-02   
呵呵,不知道是怎么回事呢。ms的console很特殊。

还有别的方法:

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

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

3.其实更常见的作法是把调试信息写入一个log文件里去,虽然不直观,但是hge,sdl,irrlicht,glfw...几乎绝大多数游戏引擎都是这么干的。
[ 此帖被shawind在2012-11-02 22:20重新编辑 ]
え~え~お!!!
secondsen 离线
级别: 总版主
显示用户信息 
6  发表于: 2012-11-02   
log我做了来着,就是想弄个命令行出来。但是就出现这个毛病了。。。OTZ。。。。我去看看1、2、都是什么。。。MS今天google找到attachConsole,但是没有仔细看。。。2那个我看看怎么做先
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
lw 离线
级别: 分版主
显示用户信息 
7  发表于: 2012-11-04   
Console的话就是直观些,

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

之后挂接防止退出也许可以?
Style-C
描述
快速回复

认证码:

验证问题:
22-5=?,答案:17 正确答案:17
按"Ctrl+Enter"直接提交