I have to create a console application which needs certain parameters. If they are missing or wrong I print out an error message.
Now the problem: If someone starts the program from the explorer by double-clicking the console window disappears immediately. (But the application is not entirely useless from the explorer, you could drag files onto it and it would work)
I could always wait for a keypress, but I don't want that if the user did start it from the command line.
Is there some way to distinguish between these situations?
See http://support.microsoft.com/kb/99115, "INFO: Preventing the Console Window from Disappearing".
The idea is to use GetConsoleScreenBufferInfo to determine that the cursor has not moved from the initial 0,0 position.
Code sample from @tomlogic, based on the referenced Knowledge Base article:
// call in main() before printing to stdout // returns TRUE if program is in its own console (cursor at 0,0) or // FALSE if it was launched from an existing console. // See http://support.microsoft.com/kb/99115 #include <stdio.h> #include <windows.h> int separate_console( void) { CONSOLE_SCREEN_BUFFER_INFO csbi; if (!GetConsoleScreenBufferInfo( GetStdHandle( STD_OUTPUT_HANDLE), &csbi)) { printf( "GetConsoleScreenBufferInfo failed: %lu\n", GetLastError()); return FALSE; } // if cursor position is (0,0) then we were launched in a separate console return ((!csbi.dwCursorPosition.X) && (!csbi.dwCursorPosition.Y)); }
GetConsoleTitle()
I've seen code which performs
if (!GetConsoleTitle(NULL, 0) && GetLastError() == ERROR_SUCCESS) { // Console } else { // GUI }
BUT... I've found that AttachConsole()
is more helpful
In C++ (off the top of my head, and I'm no C++ programmer)
if (!AttachConsole(ATTACH_PARENT_PROCESS)) { // GUI } else { // Console, and you have a handle to the console that already exists. }
Is more effective. Additionally, if you find yourself in a GUI environment and would like to stay there as long as you can, but later find something catastrophic has happened that could really use a dump to a console window (you can't be arsed writing an edit box window to lot it to or attach to the NT System log and throw up a MessageBox()
) well then you can AllocConsole()
later on in the process, when GUI methods have failed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With