我必须创建一个需要某些参数的控制台应用程序.如果它们丢失或错误,我会打印出错误信息.
现在问题是:如果有人通过双击控制台窗口从资源管理器启动程序立即消失.(但是应用程序对于资源管理器来说并不是完全无用的,你可以将文件拖到它上面它会起作用)
我总是可以等待按键,但如果用户确实从命令行启动它,我不希望这样.
有没有办法区分这些情况?
请参阅http://support.microsoft.com/kb/99115,"信息:防止控制台窗口消失".
我们的想法是使用GetConsoleScreenBufferInfo来确定光标没有从最初的0,0位置移动.
来自@tomlogic的代码示例,基于引用的知识库文章:
// 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#include 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()
我见过执行的代码
if (!GetConsoleTitle(NULL, 0) && GetLastError() == ERROR_SUCCESS) { // Console } else { // GUI }
但是......我发现这AttachConsole()
更有帮助
在C++中(我的头脑中,我不是C++程序员)
if (!AttachConsole(ATTACH_PARENT_PROCESS)) { // GUI } else { // Console, and you have a handle to the console that already exists. }
更有效.另外,如果你发现自己处于一个GUI环境中,并希望尽可能长时间呆在那里,但后来发现了一些灾难性的事情可能会真正使用转储到控制台窗口(你不能被编写一个编辑框)窗口将它批次或附加到NT系统日志并抛出a MessageBox()
)然后您可以AllocConsole()
在此过程中,当GUI方法失败时.