| | #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; |
| | } |
| |
|