71 lines
1.7 KiB
C++
71 lines
1.7 KiB
C++
|
/*
|
||
|
* 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 "../Shared/DebugClient.cc"
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
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;
|
||
|
}
|