C#如何编写调用控制台命令的语句?

刚学C#,我知道C和C++可以用system(“xx”)这样子来写,可是C#应该怎么写呢?比如要写一个20秒自动关机的C#控制台应用程序,要怎么写?谢谢各位大虾!... 刚学C#,我知道C和C++可以用system(“xx”)这样子来写,可是C#应该怎么写呢?比如要写一个20秒自动关机的C#控制台应用程序,要怎么写?谢谢各位大虾! 展开
 我来答
熊_
2012-03-20 · TA获得超过114个赞
知道答主
回答量:106
采纳率:0%
帮助的人:65.7万
展开全部
你可以把这篇文定义为一篇蛋疼的回答,应为这个东西不怎么实用,还费神,没事折腾这做什么。恩,的确,蛋疼。我也同意,就算蛋疼也有它的小众范围,当你不想做webservers,winform等,就想蛋疼的拿控制台来做服务,做程序,行吗?行,但是控制台一点关闭就退出了,有时会点错,控制台没有托盘图标,想最小化到托盘图标等,还有什么蛋疼的想法,来吧,让我们来实现他们。

需要了解:
console application是控制台程序。
控制台不是winform,我们不能设置它的关闭事件等。
控制台虽然可以通过添加引用来增加托盘图标,但是托盘图标没有事件。
哇,怎么都是不能,那不是不能实现。
所以你还需要了解:
我们可以通过引用外部dll的api来捕获到关闭事件等。
我们可以给控制台添加消息事件循环来捕获事件响应让托盘图标可以触发事件。

那么我们的思路是:
禁用关闭按钮,让用户在控制台输入exit进行退出,当控制台被其他事件关闭时可以进行处理。
用Application.DoEvents()来捕获消息事件处理,但是要用死循环来控制,那么我们怎么监听输入呢?
我们在开一个线程用来监听输入。
蛋疼的可以,搞个这还这么麻烦!

别慌,还需要你解决的问题:
先了解我给出的代码实现了什么。实现了禁用关闭按钮,托盘图标的添加和事件的处理。
你要做的是什么,当然你可以不做,如果你也想蛋疼一下,就来解决下这个问题吧。
退出控制台时,托盘图标没有消失,唉,这是bug,怎么解决?
捕获关闭事件,在要关闭时清除托盘图标。
先告诉你可以实现,我以实验成功,这里没有放出来是让你也蛋疼下。

好了,代码如下:
/*
* 控制台禁用关闭按钮并最小化到系统托盘演示
*
* 通过ConsoleWin32类来进行控制
* 添加引用 System.Runtime.InteropServices; 和 System.Threading; 用于禁用关闭按钮
* 添加引用 System.Drawing; 和 System.Windows.Forms; 用于系统托盘
*
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
using System.Drawing;
using System.Windows.Forms;

namespace Tray_beta_1
{
class Program
{
staticbool _IsExit =false;

staticvoid Main(string[] args)
{
Console.Title ="TestConsoleLikeWin32";
ConsoleWin32Helper.ShowNotifyIcon();
ConsoleWin32Helper.DisableCloseButton(Console.Title);

Thread threadMonitorInput =new Thread(new ThreadStart(MonitorInput));
threadMonitorInput.Start();

while (true)
{
Application.DoEvents();
if (_IsExit)
{
break;
}
}
}

staticvoid MonitorInput()
{
while (true)
{
string input = Console.ReadLine();
if (input =="exit")
{
_IsExit =true;
Thread.CurrentThread.Abort();
}
}
}
}

class ConsoleWin32Helper
{
static ConsoleWin32Helper()
{
_NotifyIcon.Icon =new Icon(@"G:\BruceLi Test\ConsoleAppTest\ConsoleApps\Tray\small.ico");
_NotifyIcon.Visible =false;
_NotifyIcon.Text ="tray";

ContextMenu menu =new ContextMenu();
MenuItem item =new MenuItem();
item.Text ="右键菜单,还没有添加事件";
item.Index =0;

menu.MenuItems.Add(item);
_NotifyIcon.ContextMenu = menu;

_NotifyIcon.MouseDoubleClick +=new MouseEventHandler(_NotifyIcon_MouseDoubleClick);

}

staticvoid _NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
Console.WriteLine("托盘被双击.");
}

#region 禁用关闭按钮
[DllImport("User32.dll", EntryPoint ="FindWindow")]
staticextern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint ="GetSystemMenu")]
staticextern IntPtr GetSystemMenu(IntPtr hWnd, IntPtr bRevert);

[DllImport("user32.dll", EntryPoint ="RemoveMenu")]
staticextern IntPtr RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);

///<summary>
/// 禁用关闭按钮
///</summary>
///<param name="consoleName">控制台名字</param>
publicstaticvoid DisableCloseButton(string title)
{
//线程睡眠,确保closebtn中能够正常FindWindow,否则有时会Find失败。。
Thread.Sleep(100);

IntPtr windowHandle = FindWindow(null, title);
IntPtr closeMenu = GetSystemMenu(windowHandle, IntPtr.Zero);
uint SC_CLOSE =0xF060;
RemoveMenu(closeMenu, SC_CLOSE, 0x0);
}
publicstaticbool IsExistsConsole(string title)
{
IntPtr windowHandle = FindWindow(null, title);
if (windowHandle.Equals(IntPtr.Zero)) returnfalse;

returntrue;
}
#endregion

#region 托盘图标
static NotifyIcon _NotifyIcon =new NotifyIcon();
publicstaticvoid ShowNotifyIcon()
{
_NotifyIcon.Visible =true;
_NotifyIcon.ShowBalloonTip(3000, "", "我是托盘图标,用右键点击我试试,还可以双击看看。", ToolTipIcon.None);
}
publicstaticvoid HideNotifyIcon()
{
_NotifyIcon.Visible =false;
}

#endregion
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jwnuli
2012-03-19
知道答主
回答量:23
采纳率:0%
帮助的人:6.8万
展开全部
process cmd=new process;
cmd.stateinfo.filename="systeminfo.exe";
cmd.start();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-03-21
展开全部
路过
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
肠断花开
2012-03-20
知道答主
回答量:5
采纳率:0%
帮助的人:6.1万
展开全部
楼上正解,求采纳,做任务!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式