| Note regarding ENABLE_EXTENDED_FLAGS (2016-05-30) |
|
|
| There is a complicated interaction between the ENABLE_EXTENDED_FLAGS flag |
| and the ENABLE_QUICK_EDIT_MODE and ENABLE_INSERT_MODE flags (presumably for |
| backwards compatibility?). I studied the behavior on Windows 7 and Windows |
| 10, with both the old and new consoles, and I didn't see any differences |
| between versions. Here's what I seemed to observe: |
|
|
| - The console has three flags internally: |
| - QuickEdit |
| - InsertMode |
| - ExtendedFlags |
|
|
| - SetConsoleMode psuedocode: |
| void SetConsoleMode(..., DWORD mode) { |
| ExtendedFlags = (mode & (ENABLE_EXTENDED_FLAGS |
| | ENABLE_QUICK_EDIT_MODE |
| | ENABLE_INSERT_MODE )) != 0; |
| if (ExtendedFlags) { |
| QuickEdit = (mode & ENABLE_QUICK_EDIT_MODE) != 0; |
| InsertMode = (mode & ENABLE_INSERT_MODE) != 0; |
| } |
| } |
|
|
| - Setting QuickEdit or InsertMode from the properties dialog GUI does not |
| affect the ExtendedFlags setting -- it simply toggles the one flag. |
|
|
| - GetConsoleMode psuedocode: |
| GetConsoleMode(..., DWORD *result) { |
| if (ExtendedFlags) { |
| *result |= ENABLE_EXTENDED_FLAGS; |
| if (QuickEdit) { *result |= ENABLE_QUICK_EDIT_MODE; } |
| if (InsertMode) { *result |= ENABLE_INSERT_MODE; } |
| } |
| } |
|
|
| Effectively, the ExtendedFlags flags controls whether the other two flags |
| are visible/controlled by the user application. If they aren't visible, |
| though, there is no way for the user application to make them visible, |
| except by overwriting their values! Calling SetConsoleMode with just |
| ENABLE_EXTENDED_FLAGS would clear the extended flags we want to read. |
|
|
| Consequently, if a program temporarily alters the QuickEdit flag (e.g. to |
| enable mouse input), it cannot restore the original values of the QuickEdit |
| and InsertMode flags, UNLESS every other console program cooperates by |
| keeping the ExtendedFlags flag set. |
|
|