Wine vs Windows aside, I'm curious about two other things.
1. What did you expect from ReadConsoleInput? Console means kind of terminal emulation and obviously some of input will be handled by that terminal program. You do not expect to be able to receive Ctrl+C, do you? Same with Ctrl+D, Ctrl+Z and other special combinations. I believe it is not rational to rely on any Ctrl+<?> key combinations because most users will expect them to be handled predictably by a terminal emulator, not the application running through it. Same with Alt, but this key is usually reserved for a desktop environment (system menus, window modes, etc.). Things are different for windowed applications because they are generally expected to handle input in a more complex way.
2. Why bother with these console input methods? Windows' console support is abysmal even on native platform and I do not believe people motivated to fully implement that in Wine. If you are already ready to go unportable way, why not discard that cmd.exe and use regular windowed API? Despite what written in that WM_KEYDOWN/WM_CHAR article, it is not that bad (or, more like it is equally bad everywhere) and after ruling out some extreme cases it does function consistently. Or event use dedicated output library like libtcod or BearLibTerminal (I couldn't miss this opportunity, could I).
First, thanks for testing. I had suspicions about Wine given some problems noted elsewhere. Did you use "wine start testprog" or "wineconsole testprog" or something else? Just wondering because of behavior noted here:
http://gnuplot.10905.n7.nabble.com/gnuplot-exe-in-wine-td13162.html along with the infinite hang of WaitForSingleObject.
1) ReadConsoleInput is actually a nice API, despite the weird handling of control keys. It is aimed at the Windows console, not terminal emulators. In Windows you can set the console mode to disable default CTRL-C handling. Many pre-Windows DOS programs handled control and alt keys for various purposes in text user interfaces. The biggest drawback is the lack of square mono-spaced fonts.
2) I used to write code for CP/M and DOS back in the day so the Windows console is overall a familiar interface for me. Using D, I have a full fledged console i/o interface similar to termbox in about 300 loc. Simpler and easier than making a wrapper for PDCurses or getting a ncurses lib compiled properly on Windows for use with the published D wrapper.
There aren't any mature GUI frameworks for the current version of D yet, very few under current development, and I really don't feel like writing GUI code direct to the Windows API - been there, done that and have the scars! However, I am keeping the interface to the UI relatively clean, simple, and well-defined so that I can replace it later with something better.
The alternative libraries don't seem to have current D wrappers. The Derelict package dropped support for libtcod and the old version no longer works with the current version of D. Wrapping C libraries in D is quite possible but it is highly dependent on the nature of the C header files. Macros and conditionals are a problem there. I haven't run BearLibTerminal.h through D's htod conversion tool so not sure how much additional work would be required. There is a current SDL2 wrapping which might actually be less work.
Every gamer I know has some access to Windows, whether through Wine, a VM, dual booting, or simply native. So for hobby/prototyping purposes, it isn't the worst choice of platforms.