解决方案 »
- 修改numericUpDown中的值label自动变化怎么做
- 为什么用adsi修改域用户密码一直无法成功,到底哪错了?
- Page_Load函数的两个小问题?
- 为什么在winform中调用FindWindow可以,而webform中调用FindWindow却不行?
- 关于USTO发布
- 求助:关于查询的问题: 用SELECT查询时出了问题怎么搞??
- 小问题(刚由VB转入C#),请问在windows编程中若单击按钮退出程序,用哪个命令?
- C#中,有没有取得随机数的函数啊
- 菜鸟求助
- 在C#中,连接ACCESS带有密码的数据库的连接语句应该怎样写??在线等待,马上结贴!
- C# winform 图片动画效果怎么实现啊?
- 求助!窗口问题
//给Process对象设置了几个属性,问题解决
Process process = new Process();
process.StartInfo.FileName = strPlayerPath;
process.StartInfo.Arguments = "";
process.StartInfo.WorkingDirectory = "";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.ErrorDialog = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.Close();
看下这个也许能明白点什么:http://www.cnblogs.com/eGaoYang/archive/2009/09/21/1570951.html
<identity impersonate=true userName= "Administrator " password= "你机器的管理人密码 "/>
这又涉及到EnableRaisingEvents这个属性,MSDN的意思是,只有值为True,才会触发Exited事件,否则即使程序退出,也不会触发Exited事件。 可是我写了如下程序,还是触发了Exited事件隐藏行号 复制代码 ? 这是一段程序代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace Test
{
class Program
{
public static void Main()
{
Process p = new Process();
p.StartInfo.FileName = "return0.exe";
p.EnableRaisingEvents = false;
p.Exited += new EventHandler(Process_Exited);
p.Start();
p.WaitForExit(1000 * 5);
if (p.HasExited == false) p.Kill();
for (int i = 0; i < 10000000; i++)
{
int pp = i;
}
}
private static void Process_Exited(object sender, EventArgs e)
{
Console.WriteLine("触发Exited事件");
}
}
}运行结果:
还是触发了Exited事件……对于这个问题,研究了好久,根据程序自动退出/操作系统关闭程序/process.kill结束程序三种情况,做了多次实验发现…EnableRaisingEvents为False时,程序结束的确不会触发Exited事件…但是一旦访问HasExited属性,如果Exited事件没有触发过,那么将会触发一次Exited事件
这里有个类似的
“如果未使用 Start 方法启动进程,则 StartInfo 属性不会反映启动该进程时使用的参数。例如,如果使用 GetProcesses 获取计算机上运行的进程的数组,则每个 Process 的 StartInfo 属性将不包含启动进程时使用的原始文件名称或参数。”我只好是用GetProcesses() 获取的,
补充一下 不是所有的进程都会出错(比如qq.exe就不会出错) 只是一些系统进程无法访问
而我想获取这些进程现在是否正在运行。
十分感谢您的回答
而我想获取这些进程现在是否正在运行。
我是楼主(同一账户只能发3次,所有又去注册了个马甲)
我是使用app.manifest来提供管理员身份的
同样感谢您的回复
我是楼主(同一账户只能发3次,所有又去注册了个马甲)
InvalidOperationException 没有与该对象关联的进程。
所以我觉得是你的这个process的句柄已经被回收了,也就是说,你原来获取的某个进程,已经不存在了!所以你要try
{
Mypcs = Process.GetProcesses();
lijie = Mypcs[comboBox1.SelectedIndex];
if (lijie.HasExited)
}
catch(InvalidOperationException)
{
....
}
不过 procename 的值都是存在的 如 “csrss”
而且 workingset64 的值也是有的 所以我觉得 lijie这个进程不为null 不知道这样想对不对
不然 我真的只能try catch 了 不过只要一catch 程序就会卡一会 很是不爽
大家都来帮帮我吧 我头都大了
以前我以为重新刷新,会耗资源,所有在程序中很少刷新。
今天受大家指点,在自己电脑上实践了一番。。代码如下
public Process lijie;
public Process[] mypro;
int i = 1;
public bool temp = false;
private void getprocess_Load(object sender, EventArgs e)
{
textBox1.Text = "1";
} private void button1_Click(object sender, EventArgs e)
{
i=int.Parse(textBox1.Text);
label1.Text = DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString();
for(int k=1;k<=i;k++)
{
mypro = Process.GetProcesses();
foreach (Process xx in mypro)
{
if (xx.ProcessName == "mytest")
{
temp = true;
break;
}
}
}
label2.Text=DateTime.Now.Second.ToString()+":"+DateTime.Now.Millisecond.ToString();
} 我发现在如果我刷新一次 用的时间最多为5毫秒,最少是0(比较不出来差距了,在毫秒级别) 而且刷新是越来越迅速的 随着次数的增加 时间有减少的趋势 即使我把次数设置为 10000次 也只用了 10秒
使以这样遍历一遍 会比所有try catch 好 因为只要一catch 往往程序就会卡2秒左右(可以供我刷新2000次了)
再次感谢大家 谢谢大家对我的帮助
我会努力的呵呵
1. 本地进程的权限需要提升,具体可以使用Advapi32.dll中的OpenProcessToken提升为 TOKEN_ADJUST_PRIVILEGES
具体请参考msdn中OpenProcessToken()
2. 有些安全工具会HOOK OpenProcess或者截获内核中的NTOpenProcess,让某些进程无法获得进程句柄,如360保险箱等,需要找相应的工具进行检查