Вы только получаете выстрел того в наследование. При создании абстрактного класса, а не интерфейса, кто-то, кто наследовался класс не может также наследовать другой абстрактный класс.
См. Может ли консольное приложение Win32 определить, было ли оно запущено из проводника или нет?
Или я думаю, что официальный способ проверить, что родительский процесс - это cmd.exe или explorer.exe
Просто создайте его как приложение Windows Forms, но не давайте ему графический интерфейс. К сожалению, вы не получите никакого вывода на консоль и при запуске из командной строки ... это проблема?
Итак, я Написал инструменты с графическим интерфейсом и интерфейсом командной строки. Сложнее всего было выяснить, какой из них открыть - однако в нашем случае версия CLI имела необходимые параметры, поэтому я просто открывал графический интерфейс, если не было никаких параметров. Затем, если им действительно нужна консоль, вызовите функцию, которая выглядит примерно так:
private const int ATTACH_PARENT_PROCESS = -1;
private const int ERROR_INVALID_HANDLE = 6;
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
private static bool StartConsole()
{
if (!AttachConsole(ATTACH_PARENT_PROCESS)) // try connecting to an existing console
{
if (Marshal.GetLastWin32Error() == ERROR_INVALID_HANDLE) // we don't have a console yet
{
if (!AllocConsole()) // couldn't create a new console, either
return false;
}
else
return false; // some other error
}
return true;
}
Возвращает, была ли создана консоль. Когда закончите, не забудьте вызвать FreeConsole ()!
В нашем случае, конечно, если мы не создаем консоль, мы создаем графический интерфейс. Было бы так же легко создать либо консоль, либо без пользовательского интерфейса.
РЕДАКТИРОВАТЬ: Это совершенно не отвечало на вопрос в редактировании, которого не было, когда я начинал писать это , конечно. Помимо этого, наш хак просто проверял, был ли он вызван с параметрами командной строки или нет.
Сложнее всего было выяснить, какой из них открыть - однако в нашем случае версия CLI имела необходимые параметры, поэтому я просто открывал графический интерфейс, если не было никаких параметров. Затем, если им действительно нужна консоль, вызовите функцию, которая выглядит примерно так:private const int ATTACH_PARENT_PROCESS = -1;
private const int ERROR_INVALID_HANDLE = 6;
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
private static bool StartConsole()
{
if (!AttachConsole(ATTACH_PARENT_PROCESS)) // try connecting to an existing console
{
if (Marshal.GetLastWin32Error() == ERROR_INVALID_HANDLE) // we don't have a console yet
{
if (!AllocConsole()) // couldn't create a new console, either
return false;
}
else
return false; // some other error
}
return true;
}
Возвращает, была ли создана консоль. Не забудьте вызвать FreeConsole (), когда закончите!
В нашем случае, конечно, если мы не создаем консоль, мы создаем графический интерфейс. Было бы так же легко создать либо консоль, либо без пользовательского интерфейса.
РЕДАКТИРОВАТЬ: Это совершенно не отвечало на вопрос в редактировании, которого не было, когда я начинал писать это , конечно. Помимо этого, наш хак просто проверял, был ли он вызван с параметрами командной строки или нет.
Сложнее всего было выяснить, какой из них открыть - однако в нашем случае версия CLI имела необходимые параметры, поэтому я просто открывал графический интерфейс, если не было никаких параметров. Затем, если им действительно нужна консоль, вызовите функцию, которая выглядит примерно так:private const int ATTACH_PARENT_PROCESS = -1;
private const int ERROR_INVALID_HANDLE = 6;
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
private static bool StartConsole()
{
if (!AttachConsole(ATTACH_PARENT_PROCESS)) // try connecting to an existing console
{
if (Marshal.GetLastWin32Error() == ERROR_INVALID_HANDLE) // we don't have a console yet
{
if (!AllocConsole()) // couldn't create a new console, either
return false;
}
else
return false; // some other error
}
return true;
}
Возвращает, была ли создана консоль. Когда закончите, не забудьте вызвать FreeConsole ()!
В нашем случае, конечно, если мы не создаем консоль, мы создаем графический интерфейс. Было бы так же легко создать либо консоль, либо без пользовательского интерфейса.
РЕДАКТИРОВАТЬ: Это совершенно не отвечало на вопрос в редактировании, которого не было, когда я начинал писать это , конечно. Помимо этого, наш хак просто проверял, был ли он вызван с параметрами командной строки или нет.
поэтому я просто открыл графический интерфейс, если не было никаких параметров. Затем, если им действительно нужна консоль, вызовите функцию, которая выглядит примерно так:private const int ATTACH_PARENT_PROCESS = -1;
private const int ERROR_INVALID_HANDLE = 6;
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
private static bool StartConsole()
{
if (!AttachConsole(ATTACH_PARENT_PROCESS)) // try connecting to an existing console
{
if (Marshal.GetLastWin32Error() == ERROR_INVALID_HANDLE) // we don't have a console yet
{
if (!AllocConsole()) // couldn't create a new console, either
return false;
}
else
return false; // some other error
}
return true;
}
Возвращает, была ли создана консоль. Когда закончите, не забудьте вызвать FreeConsole ()!
В нашем случае, конечно, если мы не создаем консоль, мы создаем графический интерфейс. Было бы так же легко создать либо консоль, либо без пользовательского интерфейса.
РЕДАКТИРОВАТЬ: Это совершенно не отвечало на вопрос в редактировании, которого не было, когда я начинал писать это , конечно. Помимо этого, наш хак просто проверял, был ли он вызван с параметрами командной строки или нет.
поэтому я просто открыл графический интерфейс, если не было никаких параметров. Затем, если им действительно нужна консоль, вызовите функцию, которая выглядит примерно так:private const int ATTACH_PARENT_PROCESS = -1;
private const int ERROR_INVALID_HANDLE = 6;
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
private static bool StartConsole()
{
if (!AttachConsole(ATTACH_PARENT_PROCESS)) // try connecting to an existing console
{
if (Marshal.GetLastWin32Error() == ERROR_INVALID_HANDLE) // we don't have a console yet
{
if (!AllocConsole()) // couldn't create a new console, either
return false;
}
else
return false; // some other error
}
return true;
}
Возвращает, была ли консоль создана. Когда закончите, не забудьте вызвать FreeConsole ()!
В нашем случае, конечно, если мы не создаем консоль, мы создаем графический интерфейс. Было бы так же легко создать консоль или без пользовательского интерфейса.
РЕДАКТИРОВАТЬ: Это совершенно не отвечало на вопрос в редактировании, которого не было, когда я начал писать , конечно. Помимо этого, наш хак просто проверял, был ли он вызван с параметрами командной строки или нет.
не забудьте использовать FreeConsole (), когда закончите!В нашем случае, конечно, если мы не создаем консоль, мы создаем графический интерфейс. Было бы так же легко создать либо консоль, либо без пользовательского интерфейса.
РЕДАКТИРОВАТЬ: Это совершенно не отвечало на вопрос в редактировании, которого не было, когда я начинал писать это , конечно. Помимо этого, наш хак просто проверял, был ли он вызван с параметрами командной строки или нет.
не забудьте использовать FreeConsole (), когда закончите!В нашем случае, конечно, если мы не создаем консоль, мы создаем графический интерфейс. Было бы так же легко создать либо консоль, либо без пользовательского интерфейса.
РЕДАКТИРОВАТЬ: Это совершенно не отвечало на вопрос в редактировании, которого не было, когда я начинал писать это , конечно. Помимо этого, наш хак просто проверял, был ли он вызван с параметрами командной строки или нет.
Тогда это будет больше похоже на Службу?
ИЛИ
А как насчет приложения Windows Forms, у которого нет видимой формы? Он все равно будет отображаться в списке процессов диспетчера задач.