|
#include <windows.h> |
|
|
|
#include "TestUtil.cc" |
|
|
|
const int SC_CONSOLE_MARK = 0xFFF2; |
|
const int SC_CONSOLE_SELECT_ALL = 0xFFF5; |
|
|
|
int main(int argc, char *argv[0]) { |
|
|
|
if (argc != 2) { |
|
printf("Usage: %s (mark|selectall|read)\n", argv[0]); |
|
return 1; |
|
} |
|
|
|
enum class Test { Mark, SelectAll, Read } test; |
|
if (!strcmp(argv[1], "mark")) { |
|
test = Test::Mark; |
|
} else if (!strcmp(argv[1], "selectall")) { |
|
test = Test::SelectAll; |
|
} else if (!strcmp(argv[1], "read")) { |
|
test = Test::Read; |
|
} else { |
|
printf("Invalid test: %s\n", argv[1]); |
|
return 1; |
|
} |
|
|
|
HANDLE conout = GetStdHandle(STD_OUTPUT_HANDLE); |
|
TimeMeasurement tm; |
|
HWND hwnd = GetConsoleWindow(); |
|
|
|
setWindowPos(0, 0, 1, 1); |
|
setBufferSize(100, 3000); |
|
system("cls"); |
|
setWindowPos(0, 2975, 100, 25); |
|
setCursorPos(0, 2999); |
|
|
|
ShowWindow(hwnd, SW_HIDE); |
|
|
|
for (int i = 0; i < 1000; ++i) { |
|
|
|
|
|
|
|
if (test == Test::Mark) { |
|
SendMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_MARK, 0); |
|
SendMessage(hwnd, WM_CHAR, 27, 0x00010001); |
|
} else if (test == Test::SelectAll) { |
|
SendMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_SELECT_ALL, 0); |
|
SendMessage(hwnd, WM_CHAR, 27, 0x00010001); |
|
} else if (test == Test::Read) { |
|
static CHAR_INFO buffer[100 * 3000]; |
|
const SMALL_RECT readRegion = {0, 0, 99, 2999}; |
|
SMALL_RECT tmp = readRegion; |
|
BOOL ret = ReadConsoleOutput(conout, buffer, {100, 3000}, {0, 0}, &tmp); |
|
ASSERT(ret && !memcmp(&tmp, &readRegion, sizeof(tmp))); |
|
} |
|
} |
|
|
|
ShowWindow(hwnd, SW_SHOW); |
|
|
|
printf("elapsed: %f\n", tm.elapsed()); |
|
return 0; |
|
} |
|
|