39 votes

Une application console Win32 peut-elle détecter si elle a été exécutée depuis l'explorateur ou non?

J'ai créer une application de console qui a besoin de certains paramètres. Si elles sont manquantes ou mal, j'ai imprimer un message d'erreur.

Maintenant le problème: Si quelqu'un lance le programme à partir de l'explorer en double-cliquant sur la fenêtre de la console disparaît immédiatement. (Mais l'application n'est pas totalement inutile, à partir de l'explorateur, vous pouvez faire glisser des fichiers sur et il fonctionne)

Je pouvais toujours attendre pour une pression de touche, mais je ne veux pas que si l'utilisateur n'a le démarrer à partir de la ligne de commande.

Est-il possible de faire la distinction entre ces situations?

33voto

Per Mildner Points 999

Voir http://support.microsoft.com/kb/99115 , "INFO: Empêcher la fenêtre de console de disparaître".

L'idée est d'utiliser GetConsoleScreenBufferInfo pour déterminer que le curseur ne s'est pas déplacé de la position 0,0 initiale.

Exemple de code de @tomlogic, basé sur l'article référencé de la base de connaissances:

 // 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));
}
 

6voto

bobsobol Points 39

GetConsoleTitle()

J'ai vu du code qui effectue

if (!GetConsoleTitle(NULL, 0) && GetLastError() == ERROR_SUCCESS) {
    // Console
} else {
    // GUI
}

MAIS... j'ai trouvé qu' AttachConsole() est plus utile

En C++ (sur le dessus de ma tête, et je ne suis pas un programmeur C++)

if (!AttachConsole(ATTACH_PARENT_PROCESS)) {
    // GUI
} else {
    // Console, and you have a handle to the console that already exists.
}

Est plus efficace. En outre, si vous vous trouvez dans une interface graphique, de l'environnement et voudrais y rester aussi longtemps que vous le pouvez, mais plus tard, de trouver quelque chose de catastrophique qui s'est passé qui pourraient vraiment utiliser un dump d'une fenêtre de console (vous ne pouvez pas être coincé écrit une zone d'édition de la fenêtre lot, ou de la joindre à la NT journal Système et de lancer un MessageBox()) alors vous pouvez AllocConsole() plus tard dans le processus, lorsque GUI méthodes ont échoué.

3voto

Artelius Points 25772

Je crois que cmd.exe définit les variables environnementales CMDCMDLINE et CMDEXTVERSION au démarrage. Donc, si ceux-ci sont définis, votre programme a très probablement démarré à partir d'un shell.

Ce n'est pas infaillible mais c'est quelque chose.

Il est également possible de déterminer votre PID parent de quelques façons compliquées et peut-être peu fiables, du moins je suppose. Vous voudrez peut-être examiner cela.

0voto

Martin Plante Points 2286

Que diriez-vous d'attendre une frappe lorsque vous affichez le message d'erreur, et pas d'autres fois?

0voto

Maxxim Points 3

Ça fonctionne super bien:

 @echo off
for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" goto nonconsole

:console
<do something>
goto exit

:nonconsole
<do something>
pause

:exit
 

Copié à partir de ce fil . J'ai également essayé d'évaluer% cmdcmdline% moi-même, mais il y a un problème concernant les caractères de citation ("), qui empêche quelque chose comme si"% cmdcmdline% "=="% ComSpec% "goto [cible] de fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X