C# 如何实现带参数运行时相当于控制台应用程序,无参数时相当于Windows应用程序

我尝试这样(部分测试代码):usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSyste... 我尝试这样(部分测试代码):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
static class Program //
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
public class ConsoleShow
{
/// <summary>
/// 启动控制台
/// </summary>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern bool AllocConsole();
/// <summary>
/// 释放控制台
/// </summary>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern bool FreeConsole();
}
[STAThread]
static void Main(string[] args)
{
if (args.Length > 0)
{
//控制台方式
ConsoleShow.AllocConsole();
Console.WriteLine(args[0]);
}
else
{
//窗口方式
ConsoleShow.FreeConsole();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
}
通过下面两种方式编译,但实现效果都不太好:
(1)输出类型为“Windows应用程序”时:双击运行,正常显示窗口。但命令行带参数运行时,输出的内容在新的命令行窗口中且一闪而过,不合要求。能否使它显示在原来的命令行窗口中?
(2)输出类型为“控制台应用程序”时:命令行带参数运行,输出内容正常显示。但双击运行时,能显示窗口,但窗口前有命令行窗口一闪而过,不完美。能否实现不闪呢?
分不多,聊表心意。
可能上面说的不清。
我的要求是:(设测试程序为:test.exe)
1.控制台中输入:“test.exe 123”,直接在下一行输出“123”,不许另开窗口。
2.在资源管理器中双击此test.exe,此时直接打开此程序的窗口面,不能显示控制台窗口(闪一下的也不要)。
展开
 我来答
FantasyChump
推荐于2018-03-23 · TA获得超过3288个赞
知道大有可为答主
回答量:2127
采纳率:0%
帮助的人:2251万
展开全部

代码没问题,但是做的事情多余了。满足以下几点就可以了:

  1. 输出方式为控制台应用程序

  2. 有参数时,直接做该做的事情,不需要AllocConsole或FreeConsole,也就是保持原本的状态。

  3. 无参数时,调用FreeConsole释放掉控制台,再运行Form。


这个方式有个问题,也不够完美,就是在FreeConsole之前还是会有个黑色窗口一闪而过的。就是你的第二个方案。但是相比方案一而言,应该是好很多的。


要用AllocConsole把流写入前面的控制台,有看到过解决方案,但是极其复杂且有兼容性问题,不建议做过多研究。

追问
多余的代码只为方便测试,对比输出方式为“控制台应用程序”和“Windows应用程序”时的不同。目前困扰我的就是一闪而过的窗口,请问大虾有没有方法解决,听说在代码加载时修改注册类型可以做到,但是不知如何做。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郁闷西郁闷
推荐于2016-08-18 · TA获得超过902个赞
知道小有建树答主
回答量:221
采纳率:0%
帮助的人:180万
展开全部
我在本地测试了一下,基本符合你的要求

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
static class Program
{
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
if (args.Length > 0)
{
AttachConsole(-1);
Console.WriteLine("123");
return;
}

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
更多追问追答
追问

不错的思路,但还是不够完善:



请问大虾能做到么?谢谢。

追答
改成这样,加个回车就可以了。。。

AttachConsole(-1);
Console.WriteLine("123");
System.Windows.Forms.SendKeys.SendWait("{ENTER}");
return;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
疯狂的Brant
2017-03-30 · 超过45用户采纳过TA的回答
知道小有建树答主
回答量:190
采纳率:50%
帮助的人:47.6万
展开全部

C#不精通,只是提个思路:主程序执行前加个“壳”Form1,Form1接收带参数的执行命令,由Form1来判断是用控制台还是用windows应用程序。

  1. 给Form1建参数入口,并在构造函数中处理参数。

  2. load事件加自动判断,是Console还是调Form2。

  3. Form1在托盘的图标可以作为一个控制台,加个右键菜单什么的作为扩展应用。例如可以自如切换控制台模式还是windows模式。

笨方法,不喜勿喷,谢谢。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cnsuyong
2014-10-13 · TA获得超过1075个赞
知道小有建树答主
回答量:767
采纳率:100%
帮助的人:436万
展开全部
一般来说,你的要求是无法实现的,除非你自己模拟黑窗口。一个比较简单的解决方案,供参考:写3个exe,依次为 test.exe,test_cmd.exe,test_win.exe,其中,test.exe 是一个 WinAPP,也就是你要直接打开的,不带参数就由其打开 test_win.exe(WinAPP),带参数就由其打开 test_cmd.exe(黑窗口APP,本质是假的DOS EXE)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友95005f4
2014-10-13 · 超过47用户采纳过TA的回答
知道小有建树答主
回答量:111
采纳率:0%
帮助的人:95万
展开全部
新建一个窗体项目,和控制台分开,生成2个EXE,双击控制台test.exe时,test.exe运行窗体EXE
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式