Непоследовательное поведение при изменении экранных буферов консоли на разных компьютерах с Windows 10 - PullRequest
0 голосов
/ 18 ноября 2018

Так что я возился с экранными буферами консоли и заметил, что мой код не работает одинаково, когда я компилирую и запускаю его на разных машинах.
Поэтому, когда я изменяю буфер с помощью SetConsoleActiveScreenBuffer на моем ноутбуке с Windows 10 Home , я получаю ожидаемый результат изменения экрана. Когда я вывожу что-то, используя printf, он будет выводиться в новый буфер, на который я изменился Однако на моем настольном компьютере под управлением Windows 10 Enterprise N 2016 LTSB , когда я изменяю буфер и выводю что-то с помощью printf, он вместо этого будет выводиться в исходный буфер, а не в новый установленный активный буфер. Когда я возвращаюсь к старому буферу, я вижу текст, который я вывел. Теперь, когда у меня нет доступного ноутбука, я настроил виртуальную машину под управлением Windows 10 Pro , установил сообщество VS и скомпилировал мой код, и увидел те же результаты, что и при выполнении этого на мой ноутбук.

Мои вопросы:

  • Какое из этих двух поведений правильное?
  • Как бы я исправил это несоответствие?

Эффект, который я хочу получить, заключается в возможности записи в новый буфер с помощью printf после установки его в качестве активного буфера.

Вот код:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{
    int c;
    HANDLE old_scrbuff = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE new_scrbuff = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, NULL, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    while (TRUE)
    {
        c = _getch();                   //_getch has a bug on April update of windows 10. Use static linkage with an older SDK
        printf("%d %c\n", c, c);
        if (c == 0 || c == 224)
        {
            c = _getch();
            SetConsoleActiveScreenBuffer(new_scrbuff);
            HANDLE swap = old_scrbuff;
            old_scrbuff = new_scrbuff;
            new_scrbuff = swap;
            printf("%d %c\n", c, c);
        }
    }
    return 0;
}

Я пробовал разные версии SDK, но, похоже, они не влияют на выполнение этого кода. В проекте используется Windows SDK Версия: 10.0.16299.0
Версия Windows VM: 10.0.17763 Сборка 17763
Настольная версия Windows 10.0.14393 Build 14393

...