这篇主要是实践。因为进程的使用就是类库和方法的使用,因此不做详细阐述,以例子带过。
一、进程基本操作:
1. 启动进程。使用Process.Start()。比如Process.Start("IExplorer.exe", "www.cnblogs.com")将启动IE并打开博客园。如果要启动的程序路径不在Windows环境变量中,则必须指明其绝对路径。Process.Start("1.doc")将启动Word并打开1.doc。这是因为“文件关联”了doc类型到Word程序。
2. 向启动的进程传送信息。使用类ProcessStartInfo。
ProcessStartInfo
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.Arguments = "www.cnblogs.com";
Process.Start(startInfo);
3. 使用进程谓语。进程谓语就是应用程序支持的操作,每个操作对应一个命令行参数。我们可以由ProcessStartInfo.Verbs数组得到支持的所有谓语。
进程谓语
//打印1.txt
ProcessStartInfo startInfo = new ProcessStartInfo("1.txt");
startInfo.Verb = "print";
Process.Start(startInfo);
其实谓语对应 /p %1命令行参数。在.NET中,ConsoleApplication可以直接从string[] args里面读取谓语参数。
从args读取谓语参数
static void Main(string[] args)
{
//打印
if (args[0] == "/p")
{
//args[1]为文档名
Console.WriteLine("Print " + args[1]);
}
}
从Envirment取谓语参数
string commandLine = System.Environment.CommandLine;
string[] args = commandLine.Split(new char[] { ' ' });
foreach (string str in args)
{
//打印
if (args[0] == "/p")
{
//args[1]为文档名
Console.WriteLine("Print " + args[1]);
}
}
4. 终止一个进程。对于可视化界面的Windows程序,可以调用processInstance.CloseMainWindow()和Kill()。注意:不可以嗲用实例方法processInstance.Close()。因为Close()方法其实就等同于Dispose()方法,只是释放资源,而不是杀死进程。通过调用CloseMainWindow()方法发出的结束进程运行的请求不会强制应用程序推出,它相当于用户直接单击主窗体上的“关闭”按钮,发出退出指令。应用程序可以再退出前请求用户验证,也可以拒绝退出。而Kill()则是请求操作系统直接结束进程,不给进程保存数据的机会。
二、进程间通信:
1. 使用剪贴板通讯。剪贴板对应的类是静态类System.Windows.Clipboard(WPF)。原理就不说了,大家都用过,是一个内存共享区。可以看下面的例子。利用Clipboard可以在不同进程间通过剪贴板传送自定义对象。
利用Clipboard存取数据
string myName = "Prime Li";
string outString;
//将文本数据存储在剪贴板上。将要存储的文本数据指定为一个字符串。
Clipboard.SetText(myName, TextDataFormat.Text);
if (Clipboard.ContainsText(TextDataFormat.Text))
{
outString = Clipboard.GetText(TextDataFormat.Text);
Debug.Assert(myName == outString);
}
//以指定格式在剪贴板上存储指定数据。此处为"Text"。
Clipboard.SetData(DataFormats.Text, myName);
if (Clipboard.ContainsData(DataFormats.Text))
{
object obj = Clipboard.GetData(DataFormats.Text);
if (obj != null && obj is string)
{
outString = obj.ToString();
Debug.Assert(myName == outString);
}
}
//将指定的数据对象置于系统剪贴板中
Clipboard.SetDataObject(myName);
//返回剪贴板全部内容的数据对象
IDataObject dataObject = Clipboard.GetDataObject();
//剪贴板上是否有我需要的数据?
if (dataObject.GetDataPresent(DataFormats.Text))
{
object obj = dataObject.GetData(DataFormats.Text);
if (obj != null && obj is string)
{
outString = obj.ToString();
Debug.Assert(myName == outString);
}
}
使用自定义对象进行进程间交互
/// <summary>
/// 自定义实体类
/// </summary>
[Serializable]
class MyDataObject
{
/// <summary>
/// 图片,为ImageSource类型
/// </summary>
public ImageSource Picture
{ get; set; }
/// <summary>
/// 图片说明
/// </summary>
public string Description
{ get; set; }
}
class Demo
{
/// <summary>
/// 复制到剪贴板
/// </summary>
private void CopyToClipborad()
{
MyDataObject data = new MyDataObject
{
//this.image1是界面上的一个Image图片
Picture = this.image1.Source,
Description = "我喜欢的类型,哈哈,可爱滴娃,眼睛大大滴!"
};
IDataObject myDataObject = new DataObject(data);
//其他类型数据也可以装入到数据对象中
myDataObject.SetData(DataFormats.Text, data.Description);
myDataObject.SetData(DataFormats.Bitmap, data.Picture);
//复制到剪贴板上,true表明程序退出时不清空剪贴板
Clipboard.SetDataObject(myDataObject, true);
}
/// <summary>
/// 提取剪贴板的数据
/// </summary>
private void PasteFromClipboard()
{
if (Clipboard.ContainsData("WpfApplication1.MyDataObject"))
{
IDataObject dataObject = Clipboard.GetDataObject();
MyDataObject data = dataObject.GetData("WpfApplication1.MyDataObject") as MyDataObject;
}
}
}
2. 使用FileSystemWatcher实现进程同步。FileSystemWatcher是.NET Framework提供的一个组件,它可以监控特定文件夹或文件的变化。因此,这种方法是通过共享文件来实现进程间通讯。我们可以在2个进程监听同一个文件并执行当文件改变时的策略。
FileSystemWatcher
FileSystemWatcher watcher = new FileSystemWatcher("C:", "1.txt");
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Size;
watcher.Changed += (sender, e) => MessageBox.Show(String.Format("The file {0} has changed.", e.Name));
//Begin Event
watcher.EnableRaisingEvents = true;
3. 通过COM接口控制进程。这个一般在跟Office通讯时候使用,这里不再详述,可以参考Office示例。
最后,教大家一招,快速发送Email:
Send Email
string mailTo = "mailto:lifeizhuhai@163.com?cc=prime.li@live.cn&bcc=prime.li@live.com&subject=主题&body=内容";
Process.Start(mailTo);
OK,这次进程的课程到此结束。好累哇………