1. Си / Говнокод #12156

    +137

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    /* ... */
        HWND    mywnd   = NULL;
    /* ... */
    
    #ifdef WIN32
        mywnd = GetForegroundWindow();
        if(GetWindowLong(mywnd, GWL_WNDPROC)) {
            for(i = 1; i < argc; i++) {
                if(verbose_options(argv[i]) < 0) break;
                switch(argv[i][1]) {
                    case 'f': i++;  break;
                    case 'F': i++;  break;
                    case 'L': i++;  break;
                    case 'a': i++;  break;
                    default: break;
                }
            }
            if(i > argc) i = argc;
            i = 3 - (argc - i);
            if(i > 0) {
                fprintf(stderr,
                    "- GUI mode activated, remember that the tool works also from command-line\n"
                    "  where are available various options like folder scanning, filters and so on\n"
                    "\n");
                /* дальше пляски с извлечением параметров из argv */
            }
        }
    #endif

    Наткнулся на утилиту, которая умеет отличать запуск из гуев и из консоли. Полез глядеть, как сделано, а там вот такие чудеса.

    Запостил: PascalGovno, 20 Ноября 2012

    Комментарии (11) RSS

    • Как ни странно - работает, а автор в комментах пишет, что даже 9х поддерживается.
      Ответить
    • Нужно было GetConsoleWindow?

      А вообще двойное использование это известная проблема. Если приложение консольное, то при старте будет всегда создаваться консоль, а если оконное, то при запуске из консоли процесс будет запускаться отдельно от нее. В Visual Studio это, помнится, решили хитро: сделали запускаемый файл не екзешником, а комом: MSDEV.COM .
      Ответить
      • после фразы "двойное использование" вместо "приложение консольное" прочитал "приложение костыльное"
        Ответить
      • Только этот ком фейковый, внутри Збиковский упоминается.

        Существует путь короче - http://msdn.microsoft.com/library/windows/desktop/ms683170
        Ответить
        • А, даже так. Любопытно.

          Но GetConsoleProcessList вряд ли поможет. Потому что проблема на уровне ОС, а не программы:
          - если .exe консольный (по флагу в заголовке), то при запуске ярлыком выскочит консоль. Которую, конечно, можно сразу же Free, но будет некрасиво.
          - если гуевый, то консоль вернется к приглашению сразу же после запуска.
          Ответить
          • Все так и есть, универсальности в винде нет в принципе. Пакетное исполнение не продолжится, пока юзер не закончит интерактивничать.
            С другой стороны, если файл помечен для GUI, то нет никакой возможности присоединиться к консоли родителя и выводить туда трейс. Последнее было бы очень заманчиво.

            Тут речь о том, как жить с вышеперечисленным взаимным недружелюбием подсистем. Например, не дать выведенному тексту пропасть если вдруг запустили из графической оболочки. Здесь как раз GetConsoleProcessList поможет.
            Ответить
    • Если программа может работать в гуевом и пакетном режимах, почему не привязать гуевый режим к запуску без параметров?
      Ответить
      • Возможно потому, что в ярлыке, запускающем прогу, можно дописать своих параметров в пути запуска (и потом пользователь будет долго удивляться, почему перестало появляться окно).
        Ответить

    Добавить комментарий