5 const int SC_CONSOLE_MARK = 0xFFF2;
6 const int SC_CONSOLE_SELECT_ALL = 0xFFF5;
8 int main(int argc, char *argv[0]) {
11 printf("Usage: %s (mark|selectall|read)\n", argv[0]);
15 enum class Test { Mark, SelectAll, Read } test;
16 if (!strcmp(argv[1], "mark")) {
18 } else if (!strcmp(argv[1], "selectall")) {
19 test = Test::SelectAll;
20 } else if (!strcmp(argv[1], "read")) {
23 printf("Invalid test: %s\n", argv[1]);
27 HANDLE conout = GetStdHandle(STD_OUTPUT_HANDLE);
29 HWND hwnd = GetConsoleWindow();
31 setWindowPos(0, 0, 1, 1);
32 setBufferSize(100, 3000);
34 setWindowPos(0, 2975, 100, 25);
35 setCursorPos(0, 2999);
37 ShowWindow(hwnd, SW_HIDE);
39 for (int i = 0; i < 1000; ++i) {
40 // CONSOLE_SCREEN_BUFFER_INFO info = {};
41 // GetConsoleScreenBufferInfo(conout, &info);
43 if (test == Test::Mark) {
44 SendMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_MARK, 0);
45 SendMessage(hwnd, WM_CHAR, 27, 0x00010001);
46 } else if (test == Test::SelectAll) {
47 SendMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_SELECT_ALL, 0);
48 SendMessage(hwnd, WM_CHAR, 27, 0x00010001);
49 } else if (test == Test::Read) {
50 static CHAR_INFO buffer[100 * 3000];
51 const SMALL_RECT readRegion = {0, 0, 99, 2999};
52 SMALL_RECT tmp = readRegion;
53 BOOL ret = ReadConsoleOutput(conout, buffer, {100, 3000}, {0, 0}, &tmp);
54 ASSERT(ret && !memcmp(&tmp, &readRegion, sizeof(tmp)));
58 ShowWindow(hwnd, SW_SHOW);
60 printf("elapsed: %f\n", tm.elapsed());