幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6970|回复: 7

[通用编程] AllocConsole关闭就退出进程,怎么办啊?

[复制链接]

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2012-10-31 22:32:55 | 显示全部楼层 |阅读模式
RT。。。。我希望点击AllocConsole的命令行窗口的 “X”按钮执行FreeConsole而不是退出进程,这应该怎么办啊?


    if (AllocConsole())
    {
        SetConsoleTitleA("Debug Window");
        freopen("CONOUT$","w+t",stdout);
        freopen("CONIN$","r+t",stdin);
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-11-1 14:48:22 | 显示全部楼层
allocconsole创建出来的,不是一般的窗口,很难为其单独处理消息循环,你可以取了其句柄后操作它试试。
codeproject上都是提供的最简单暴力的作法:
  1. AllocConsole();
  2. HWND console_hwnd = GetConsoleWindow();
  3. HMENU hmenu = GetSystemMenu(console_hwnd, FALSE);
  4. DeleteMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);
复制代码
え~え~お!!!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-11-1 15:02:26 | 显示全部楼层
这个方法我也找到了,但是太暴力了,我想把关闭变成freeconsole
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-11-1 17:26:14 | 显示全部楼层
用SetWindowLong为console窗口指定新的消息函数不知道行不行。

再不然就用hook吧。
え~え~お!!!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 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);
}
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-11-2 22:10:16 | 显示全部楼层
呵呵,不知道是怎么回事呢。ms的console很特殊。

还有别的方法:

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

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

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

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-11-2 23:24:14 | 显示全部楼层
log我做了来着,就是想弄个命令行出来。但是就出现这个毛病了。。。OTZ。。。。我去看看1、2、都是什么。。。MS今天google找到attachConsole,但是没有仔细看。。。2那个我看看怎么做先
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2012-11-4 20:31:38 | 显示全部楼层
Console的话就是直观些,

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

之后挂接防止退出也许可以?
Style-C
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 09:26 , Processed in 0.024924 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表