如何知道windows应用程序是否在子系统控制台上运行?

如何知道windows应用程序是否在子系统控制台上运行?,windows,console,aero,subsystem,Windows,Console,Aero,Subsystem,我有一个应用程序,它检查每个打开的窗口是否都是cmd.exe窗口,然后添加Aero Glass而不是黑色背景Windows Vista和Windows 7,或者使背景透明而不是黑色背景。 现在,我想将我的应用程序更改为检查属于该窗口的进程是否通常是控制台应用程序,而不是专门检查cmd.exe窗口。 如何检查可执行文件的子系统是否为控制台?如果GUI进程通过AllocConsole分配控制台会怎么样?此外,控制台进程可以创建自己的窗口。因此,名义上由控制台子系统进程拥有的窗口不一定是控制台窗口,而

我有一个应用程序,它检查每个打开的窗口是否都是cmd.exe窗口,然后添加Aero Glass而不是黑色背景Windows Vista和Windows 7,或者使背景透明而不是黑色背景。 现在,我想将我的应用程序更改为检查属于该窗口的进程是否通常是控制台应用程序,而不是专门检查cmd.exe窗口。
如何检查可执行文件的子系统是否为控制台?

如果GUI进程通过AllocConsole分配控制台会怎么样?此外,控制台进程可以创建自己的窗口。因此,名义上由控制台子系统进程拥有的窗口不一定是控制台窗口,而由GUI进程拥有的窗口可能是控制台窗口。真正的所有者是conhost.exe的实例,它承载窗口过程和消息循环,但操作系统将分配控制台的进程指定为其名义所有者。如果该进程退出,则名义所有权将转移到附加进程列表中的下一个进程,依此类推。您可以枚举顶级窗口,并通过检查ConsoleWindowClass。然后调用GetWindowThreadProcessId以获取标称拥有进程ID。将PID发送到通过AttachConsole连接的非控制台工作进程;通过GetConsoleWindow获取控制台窗口句柄;通过FreeConsole分离;并将句柄值通过管道传回主进程。不要使用主进程进行此操作,因为当控制台关闭时,附加的进程会终止。非常感谢。GetClassName做到了这一点。然而,窗口类名不是一个文档化的属性。因此,我建议验证它实际上是一个控制台窗口。您的应用程序也可以在新的控制台应用程序启动时收到通知,即EVENT_console_START_应用程序。你必须进行实验。我记不起该事件是否仅在控制台子系统进程分配新控制台时发送,还是在创建继承控制台的控制台进程时也发送。当GUI进程调用AllocConsole或AttachConsole时,它也可能被发送。