/* * This test demonstrates that putting a console into selection mode does not * block the low-level console APIs, even though it blocks WriteFile. */ #define _WIN32_WINNT 0x0501 #include "../src/shared/DebugClient.cc" #include #include const int SC_CONSOLE_MARK = 0xFFF2; CALLBACK DWORD writerThread(void*) { CHAR_INFO xChar, fillChar; memset(&xChar, 0, sizeof(xChar)); xChar.Char.AsciiChar = 'X'; xChar.Attributes = 7; memset(&fillChar, 0, sizeof(fillChar)); fillChar.Char.AsciiChar = ' '; fillChar.Attributes = 7; COORD oneCoord = { 1, 1 }; COORD zeroCoord = { 0, 0 }; while (true) { SMALL_RECT writeRegion = { 5, 5, 5, 5 }; WriteConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), &xChar, oneCoord, zeroCoord, &writeRegion); Sleep(500); SMALL_RECT scrollRect = { 1, 1, 20, 20 }; COORD destCoord = { 0, 0 }; ScrollConsoleScreenBuffer(GetStdHandle(STD_OUTPUT_HANDLE), &scrollRect, NULL, destCoord, &fillChar); } } int main() { CreateThread(NULL, 0, writerThread, NULL, 0, NULL); trace("marking console"); HWND hwnd = GetConsoleWindow(); PostMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_MARK, 0); Sleep(2000); trace("reading output"); CHAR_INFO buf[1]; COORD bufSize = { 1, 1 }; COORD zeroCoord = { 0, 0 }; SMALL_RECT readRect = { 0, 0, 0, 0 }; ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), buf, bufSize, zeroCoord, &readRect); trace("done reading output"); Sleep(2000); PostMessage(hwnd, WM_CHAR, 27, 0x00010001); Sleep(1100); return 0; }