|
|
|
|
|
|
|
|
|
|
|
|
|
#include <windows.h> |
|
|
|
#include <stdio.h> |
|
#include <string.h> |
|
|
|
#include "TestUtil.cc" |
|
|
|
const int SC_CONSOLE_MARK = 0xFFF2; |
|
const int SC_CONSOLE_SELECT_ALL = 0xFFF5; |
|
|
|
static COORD getWindowPos(HANDLE conout) { |
|
CONSOLE_SCREEN_BUFFER_INFO info = {}; |
|
BOOL ret = GetConsoleScreenBufferInfo(conout, &info); |
|
ASSERT(ret && "GetConsoleScreenBufferInfo failed"); |
|
return { info.srWindow.Left, info.srWindow.Top }; |
|
} |
|
|
|
static COORD getWindowSize(HANDLE conout) { |
|
CONSOLE_SCREEN_BUFFER_INFO info = {}; |
|
BOOL ret = GetConsoleScreenBufferInfo(conout, &info); |
|
ASSERT(ret && "GetConsoleScreenBufferInfo failed"); |
|
return { |
|
static_cast<short>(info.srWindow.Right - info.srWindow.Left + 1), |
|
static_cast<short>(info.srWindow.Bottom - info.srWindow.Top + 1) |
|
}; |
|
} |
|
|
|
static COORD getCursorPos(HANDLE conout) { |
|
CONSOLE_SCREEN_BUFFER_INFO info = {}; |
|
BOOL ret = GetConsoleScreenBufferInfo(conout, &info); |
|
ASSERT(ret && "GetConsoleScreenBufferInfo failed"); |
|
return info.dwCursorPosition; |
|
} |
|
|
|
static void setCursorPos(HANDLE conout, COORD pos) { |
|
BOOL ret = SetConsoleCursorPosition(conout, pos); |
|
ASSERT(ret && "SetConsoleCursorPosition failed"); |
|
} |
|
|
|
int main() { |
|
const HANDLE conout = openConout(); |
|
const HWND hwnd = GetConsoleWindow(); |
|
ASSERT(hwnd != NULL && "GetConsoleWindow() returned NULL"); |
|
|
|
|
|
|
|
|
|
|
|
const auto windowSize = getWindowSize(conout); |
|
if (windowSize.X <= 1) { |
|
printf("Error: console window must be at least 2 columns wide\n"); |
|
trace("Error: console window must be at least 2 columns wide"); |
|
return 1; |
|
} |
|
|
|
bool cursorMoved = false; |
|
const auto initialPos = getCursorPos(conout); |
|
|
|
const auto windowPos = getWindowPos(conout); |
|
setCursorPos(conout, { static_cast<short>(windowPos.X + 1), windowPos.Y }); |
|
|
|
{ |
|
const auto posA = getCursorPos(conout); |
|
SendMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_MARK, 0); |
|
const auto posB = getCursorPos(conout); |
|
cursorMoved = memcmp(&posA, &posB, sizeof(posA)) != 0; |
|
SendMessage(hwnd, WM_CHAR, 27, 0x00010001); |
|
} |
|
|
|
setCursorPos(conout, initialPos); |
|
|
|
if (cursorMoved) { |
|
printf("Legacy console (i.e. MARK moved cursor)\n"); |
|
trace("Legacy console (i.e. MARK moved cursor)"); |
|
} else { |
|
printf("Windows 10 new console (i.e MARK did not move cursor)\n"); |
|
trace("Windows 10 new console (i.e MARK did not move cursor)"); |
|
} |
|
|
|
return 0; |
|
} |
|
|