如果我将我的程序设置为Windows Application
,并使用了AttachConsole(-1)
API,如何获取Console.WriteLine
写入我启动应用程序的控制台?这对我不起作用。
如果相关的话,我使用的是 Windows 7 x64,并且启用了 UAC。但提升似乎并不能解决问题,使用也不能解决问题start /wait
.
Update
一些可能有帮助的额外背景:
我刚刚发现如果我进入命令提示符并键入cmd /c MyProgram.exe
, 然后控制台输出就可以了。如果我启动命令提示符,打开一个cmd.exe
子进程,并从该子 shell 运行程序。
我还尝试注销并重新登录,从开始菜单启动的 cmd.exe 运行(而不是右键单击 -> 命令提示符),然后从一个console2实例 http://sourceforge.net/projects/console/。这些都不起作用。
背景
我在其他网站和几个 SO 答案中读到我可以调用 win32 APIAttachConsole
将我的 Windows 应用程序绑定到运行我的程序的控制台,这样我就可以拥有“既是控制台应用程序又是 Windows 应用程序”的东西。
例如这个问题:是否可以将消息记录到 C#/.Net 中的 cmd.exe? https://stackoverflow.com/questions/6546455/is-it-possible-to-log-message-to-cmd-exe-in-c-net.
我已经编写了一堆逻辑来实现这项工作(使用其他几个 API),并且我已经让所有其他场景都可以工作(包括重定向,其他人声称这不起作用)。剩下的唯一场景是得到Console.WriteLine
写入我启动程序的控制台。从我读过的所有内容来看,如果我使用的话,这应该可以工作AttachConsole
.
Repro
这是一个最小的示例 - 请注意,该项目设置为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
,我收到错误“System.ComponentModel.Win32Exception (0x80004005):句柄无效”。我怀疑连接到控制台导致Console.Out
搞砸了,但我不知道如何解决它。