Как определить контекст, из которого выполняется приложение? Из командной строки или из формы Windows - PullRequest
1 голос
/ 10 февраля 2009

Я пытаюсь запустить набор тестовых примеров через одно из наших внутренних приложений. Мне нужно иметь возможность автоматизировать эти тесты и запускать их через командную строку и регистрировать различные вещи. Проблема в том, что существующий код не отделяет представление от контроллера и выдает сообщения и оповещения везде, где пользователь просит нажать кнопку (в моем случае просто OK / CONTINUE). В настоящее время было решено ввести флаги состояния, которые помогут определить контекст, из которого запускается приложение, чтобы можно было решить, делать ли Console.WriteLine() или MessageBox.Show(). Но, как вы можете себе представить, это касалось множества изменений и грязных блоков if-else.

К сожалению, на данном этапе не представляется возможным сесть и отделить логику от взгляда. Поэтому мне было интересно, есть ли способ определить контекст, в котором выполняется приложение. Я хотел бы заменить каждый вызов MessageBox () на вызов Notify (), который сам может определить контекст - отображать ли вывод в командной строке или всплывающую форму.

EDIT_1: любые другие предложения для этого также приветствуются.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2009

В C с использованием Win32 API (не проверено):

// requires Windows 2000 or later (for GetConsoleWindow)
int parent_owns_the_console()
{
    DWORD pid=0;
    GetWindowThreadProcessId(GetConsoleWindow(), &pid);
    return pid && pid != GetCurrentProcessId();
}
0 голосов
/ 10 февраля 2009

В моем приложении я анализирую аргументы командной строки и устанавливаю некоторые внутренние флаги. Если вы добавите этот тип синтаксического анализа в точку входа вашего приложения, например, наличие аргумента командной строки, для которого задано значение «Y» - можно установить соответствующий флаг в приложении, используемом для определения, куда отправляется вывод.

Лично я записываю весь вывод "STDOUT" (консоль) в файл журнала, а затем, если он не работает в "запланированном" режиме, - я выдаю msgbox().

...