Так что я возился с экранными буферами консоли и заметил, что мой код не работает одинаково, когда я компилирую и запускаю его на разных машинах.
Поэтому, когда я изменяю буфер с помощью 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