Как отключить или обнаружить изменения режима в консоли Windows? - PullRequest
0 голосов
/ 02 апреля 2020

Я экспериментирую с разработкой игр, используя консоль Windows (C ++), и мне удалось изменить размер экранного буфера и окна до желаемого размера. Проблема в том, что пользователи могут нажать Alt + Enter, чтобы включить полноэкранный режим - я хочу этого избежать, потому что:

1: вход в полноэкранный режим изменяет размер буфера экрана по сравнению с моим тщательно спланированным макетом.

2: при возврате в оконный режим появляются полосы прокрутки.

В идеале я бы хотел полностью отключить изменение полноэкранного режима , в качестве компромисса я бы хотел обнаружение изменения режима , чтобы я мог обновлять переменные размера буфера / удалять полосы прокрутки, когда происходит изменение. Это было достаточно просто в Win32 через WindowPro c, но Console, похоже, не имеет этого.

Есть предложения?

1 Ответ

0 голосов
/ 03 апреля 2020

Несмотря на то, что никакие изменения в стилях окон не имеют значения (изменения стиля как при входе, так и при выходе из полноэкранного режима), я смог использовать функцию SetWinEventHook для обнаружения изменений.

// Console Layout Change Detection

// Includes:
#include <Windows.h>
#include <iostream>

// Globals:
HWND g_hWindow;

// EventProc: User defined event procedure callback function
void CALLBACK EventProc(HWINEVENTHOOK hook, DWORD event, HWND wnd, LONG object, LONG child,
                                    DWORD thread, DWORD time) {
    std::cout << "Event received...\n";
    OutputDebugString(L"Event received...\n");

    // ToDo: Respond to layout change here...
}


// Main
int main() {
    // Grab the window handle
    g_hWindow = GetConsoleWindow();

    // Set a window event hook for the console layout changed events such
    // as resize, maximise/restore, enter/exit full screen mode, and others...
    HWINEVENTHOOK eventHook = SetWinEventHook(EVENT_CONSOLE_LAYOUT, EVENT_CONSOLE_LAYOUT,
                                            NULL, EventProc, 0, 0, WINEVENT_OUTOFCONTEXT);
    if (eventHook != 0) std::cout << "Hook started!\n";
    else std::cout << "Hook not started!\n";

    // Message loop. This one specifically listens for the console layout changed event.
    // If the window handle isn't specified, the hook will pick up ANY console window changes,
    // not just the one associated with this code.
    MSG msg;
    while (GetMessage(&msg, g_hWindow, EVENT_CONSOLE_LAYOUT, EVENT_CONSOLE_LAYOUT)) {
        DispatchMessage(&msg);

        /*...*/
    }
}
...