Win32控制台应用程序可以检测是否已经从资源pipe理器运行了吗?

我必须创build一个需要某些参数的控制台应用程序。 如果他们缺less或错误,我打印出一个错误信息。

现在的问题是:如果有人通过双击控制台窗口从资源pipe理器启动程序立即消失。 (但是这个应用程序并不是完全没有用的,你可以把文件拖到它上面,这样就行了)

总是可以等待按键,但是如果用户从命令行启动它,我不希望这样做。

有没有办法区分这些情况?

请参阅http://support.microsoft.com/kb/99115,“INFO :防止控制台窗口消失”。

这个想法是使用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 <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()

我见过的代码执行

 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系统日志并抛出一个MessageBox() ),那么当GUI方法失败时,您可以稍后在此过程中使用AllocConsole()

我相信cmd.exe启动时会设置CMDCMDLINE和CMDEXTVERSION环境variables。 所以,如果这些设置你的程序很可能是从一个shell启动。

这不是万无一失的,但它是一些东西。

也有可能以一些令人费解的和可能不可靠的方式确定你的父母的PID,或者因此我收集。 你可能想看看。

在显示错误信息时等待按键,而不是其他时间?

这就像一个魅力:

 @echo off for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" goto nonconsole :console <do something> goto exit :nonconsole <do something> pause :exit 

从这个线程复制。 我也尝试过自己评估%cmdcmdline%,但是有一个关于引号字符(“)的问题,它可以防止类似于”%cmdcmdline%“==”%ComSpec%“goto [target]的工作。