Если я установил свою программу на Windows Application
и использовал AttachConsole(-1)
API, как мне получить Console.WriteLine
для записи в консоль, с которой я запустил приложение?Это не работает для меня.
В случае, если это актуально, я использую Windows 7 x64, и у меня включено UAC.Повышение, похоже, не решает проблему, равно как и использование start /wait
.
Обновление
Некоторые дополнительные сведения, которые могут помочь:
Я только что обнаружил, что если я иду в командную строку и набираю cmd /c MyProgram.exe
, , то консольный вывод работает .То же самое верно, если я запускаю командную строку, открываю подпроцесс cmd.exe
и запускаю программу из этой вложенной оболочки.
Я также пытался выйти из системы и вернуться обратно, запустив изcmd.exe запускается из меню «Пуск» (в отличие от щелчка правой кнопкой мыши -> командная строка) и запускается из экземпляра console2 .Ничего из этого не работает.
Справочная информация
Я читал на других сайтах и в нескольких SO-ответах, что я могу вызвать win32 API AttachConsole
для привязки моей WindowsПриложение к консоли, на котором запущена моя программа, поэтому у меня может быть что-то «и консольное приложение, и приложение Windows».
Например, этот вопрос: Можно ли записать сообщение вcmd.exe в C # /. Net? .
Я написал кучу логики, чтобы сделать эту работу (используя несколько других API), и я получил все остальные сценарии для работы (включая перенаправление, который другие утверждали, не будет работать).Единственный оставшийся сценарий - заставить Console.WriteLine
записать на консоль, с которой я запустил свою программу.Из всего, что я прочитал, это должно работать, если я использую AttachConsole
.
Repro
Вот минимальный пример - Обратите внимание, что проект настроен наa Windows Application
:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
class Program
{
[STAThread]
static void Main(string[] args)
{
if (!AttachConsole(-1))
{
MessageBox.Show(
new Win32Exception(Marshal.GetLastWin32Error())
.ToString()
);
}
Console.WriteLine("Test");
}
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
private static extern bool AttachConsole(int processId);
}
- Когда я запускаю это из командной строки, я не получаю сообщение об ошибке, но также не получаю никакого вывода на консоль. Это проблема
- Если я добавлю дополнительные окна сообщений в любом месте потока выполнения приложения, появится окно сообщения.Я ожидаю этого, так что все хорошо здесь.
- Когда я запускаю это из Visual Studio или дважды щелкаю по нему, появляется окно сообщения с ошибкой.Я ожидаю этого, так что не беспокойтесь здесь (буду использовать
AllocConsole
в моем реальном приложении).
Если я позвоню Marshal.GetLastWin32Error
после вызова Console.WriteLine
, я получу ошибку "Система.ComponentModel.Win32Exception (0x80004005): дескриптор недействителен ».Я подозреваю, что при подключении к консоли происходит сбой Console.Out
, но я не уверен, как это исправить.