Консоль vs GUI в избранное  новое горячее всё    подписка   модер. 
От: Hibiscus 
Дата: 28.07.10 12:16
Всем привет!

Такая проблема. Есть MFC-проект, с окошками и т.д., к нему еще прикручена консоль, примерно так, как написано вот здесь
Автор: onegold
Дата: 25.11.05
(единственное отличие: вывожу я в нее обычным wprintf_s, без cout). Проблема в том, что когда мы закрываем консоль, нажав на крестик, все приложение закрывается, при этом GUI никак об этом не узнает (т.е. никаких WM_CLOSE не приходит). Как сделать так, чтобы он об этом узнавал? Задача, чтобы можно было во время работы динамически то открывать, то закрывать консоль.

Заранее спасибо за советы!
Re: Консоль vs GUI в избранное  новое    модер. 
От: Pavel Dvorkin 
Дата: 29.07.10 09:26
Оценка:2 (1) +1
Здравствуйте, Hibiscus, Вы писали:

H>Всем привет!


H>Такая проблема. Есть MFC-проект, с окошками и т.д., к нему еще прикручена консоль, примерно так, как написано вот здесь
Автор: onegold
Дата: 25.11.05
(единственное отличие: вывожу я в нее обычным wprintf_s, без cout). Проблема в том, что когда мы закрываем консоль, нажав на крестик, все приложение закрывается, при этом GUI никак об этом не узнает (т.е. никаких WM_CLOSE не приходит). Как сделать так, чтобы он об этом узнавал?


SetConsoleCtrlHandler
With best regards
Pavel Dvorkin
Re[2]: Консоль vs GUI в избранное  новое    модер. 
От: Hibiscus 
Дата: 31.07.10 14:45
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>SetConsoleCtrlHandler


Да вот не помогает что-то. Причем обработчик срабатывает (ставлю breakpoint), и возвращаю TRUE, прога все равно вылетает. Пока насильно задисейблил кнопку закрытия на консольке, но хотелось конечно не этого. Возможно проблема в системе (Win7 x86).
Re[3]: Консоль vs GUI в избранное  новое    модер. 
От: Dzirt2005 
Дата: 31.07.10 17:17
Здравствуйте, Hibiscus, Вы писали:

H>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>SetConsoleCtrlHandler


H>Да вот не помогает что-то. Причем обработчик срабатывает (ставлю breakpoint), и возвращаю TRUE, прога все равно вылетает. Пока насильно задисейблил кнопку закрытия на консольке, но хотелось конечно не этого. Возможно проблема в системе (Win7 x86).


Выделенное — и есть проблема... Можете проверить на WinXP — все будет работать. Способа таки отловить момент закрытия консоли под Win7 при нажатии "на крестик" пока не знаю
Re[3]: Консоль vs GUI в избранное  новое    модер. 
От: Nikolazwww.nikeware.com
Дата: 01.08.10 11:03
Здравствуйте, Hibiscus, Вы писали:

Вот кусок кода из одного старого проекта. Как это работает в Win 7 я не знаю, но вплоть до WinXP это вроде работало нормально.

// Console "CtrlHandler" signal function
// Warning: Correctly worked only on Windows NT!
// On Windows 95, the signal handler function only
// gets called for the CTRL_C_EVENT and CTRL_BREAK_EVENT signals.
// See MSDN - "CTRL_CLOSE_EVENT" word to find.

BOOL WINAPI SlaveCtrlHandler(DWORD dwCtrlType)
{
    // Important only debug mode!
    // If "Control+C" or "Control+Break" exceptions occured when You press "Ctrl+C" or "Ctrl+Break",
    // please see "Exceptions" dialog in the Visual Studio(menu item - "Debug\Exceptions..." in debug mode)
    // Handlers of these exceptions must be have "Stop if not handled" action
    // instead "Stop always"!!!

    switch(dwCtrlType)
    {
        case CTRL_C_EVENT:
        case CTRL_BREAK_EVENT:
                // Processed.
                return TRUE;

        case CTRL_CLOSE_EVENT:
        case CTRL_LOGOFF_EVENT:
        case CTRL_SHUTDOWN_EVENT:
            {
                StructINPUT_RECORD IR[2];
                DWORD    dwWritten = 0;

                // Simulate keys pressing ("Ctrl+F4") to close console window
                IR[0].EventType = IR[1].EventType = KEY_EVENT;
                IR[0].Event.KeyEvent.bKeyDown = IR[1].Event.KeyEvent.bKeyDown = TRUE;
                IR[0].Event.KeyEvent.uChar.AsciiChar = IR[1].Event.KeyEvent.uChar.AsciiChar = 0x00;
                IR[0].Event.KeyEvent.wVirtualKeyCode = VK_CONTROL;
                IR[1].Event.KeyEvent.wVirtualKeyCode = VK_F4;

                ::WriteConsoleInput( ::GetStdHandle(STD_INPUT_HANDLE),
                    (INPUT_RECORD*) IR, 2, &dwWritten);

                // Processed.
                return TRUE;
            }
    }

    return FALSE;
}
--
www.nikeware.com — "To merge or not to merge?"
Re[4]: Консоль vs GUI в избранное  новое    модер. 
От: Hibiscus 
Дата: 03.08.10 14:37
Здравствуйте, Nikolaz, Вы писали:

N>Здравствуйте, Hibiscus, Вы писали:


N>Вот кусок кода из одного старого проекта. Как это работает в Win 7 я не знаю, но вплоть до WinXP это вроде работало нормально.


skip

Вот ровно так и у меня написано. Но не работает. Пошерстил по инету, похоже действительно проблема в Win7. Проверить прогу под WinXP нет возможности пока. Как проверю, отпишусь.
Re[5]: Консоль vs GUI в избранное  новое    модер. 
От: Nikolazwww.nikeware.com
Дата: 03.08.10 19:24
Здравствуйте, Hibiscus, Вы писали:

H>Вот ровно так и у меня написано. Но не работает.

Я все-таки что именно "ровно так и у меня"? Код можете показать?
В приведенном выше примере помимо просто возврата TRUE, еще производится симуляция нажатия Ctrl+F4 записью в буфер клавиатуры консоли.
--
www.nikeware.com — "To merge or not to merge?"