c#进程控制问题

tianv85 2012-01-31 07:22:42
private void button1_Click(object sender, EventArgs e)
{
Process[] p = Process.GetProcessesByName("War3");
p[0].Kill();
}

其他的进程都可以关闭,魔兽3的进程失败,求大大解释!
...全文
234 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianv85 2012-10-14
  • 打赏
  • 举报
回复
和使用一般的类一样!
[Quote=引用 9 楼 的回复:]

能不能把你调好的代码发一下啊,,我用了不行。。。。
[/Quote]
linziqi527 2012-09-03
  • 打赏
  • 举报
回复
能不能把你调好的代码发一下啊,,我用了不行。。。。
tianv85 2012-01-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qldsrx 的回复:]

有些程序在关闭事件中加了代码,比如询问你是否要退出,这种阻止正常退出的功能一旦存在,就无法通过正常的途径关闭程序了。
[/Quote]

调试好了,之前是没获取到进程的id,这次成功关闭,感谢大大!
tianv85 2012-01-31
  • 打赏
  • 举报
回复
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace exe_controller
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
PKill pkill = new PKill();
Process[] ps = Process.GetProcesses();
foreach (Process item in ps)
{
if (item.ProcessName == "War3")
{
int i;
i = item.Id;
pkill.KillProcess(i.ToString(), "War3");
}
}
}
}
}
tianv85 2012-01-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qldsrx 的回复:]

Process.GetProcessesByName("War3")返回的这个Process对象里,有个ID属性,就是processId了。
[/Quote]

程序调试好了,魔兽3 的进程关不掉, MessageBox.Show(string.Format("杀死进程{0}时失败,原因不明。", processName));
qldsrx 2012-01-31
  • 打赏
  • 举报
回复
Process.GetProcessesByName("War3")返回的这个Process对象里,有个ID属性,就是processId了。
tianv85 2012-01-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qldsrx 的回复:]

有些程序在关闭事件中加了代码,比如询问你是否要退出,这种阻止正常退出的功能一旦存在,就无法通过正常的途径关闭程序了。
[/Quote]

原来如此,高手多谢,另外想问下楼主方法的原理,看不太明白,只会调用,另外这个processId怎么获取,比如魔兽3 的processId。
qldsrx 2012-01-31
  • 打赏
  • 举报
回复
有些程序在关闭事件中加了代码,比如询问你是否要退出,这种阻止正常退出的功能一旦存在,就无法通过正常的途径关闭程序了。
tianv85 2012-01-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qldsrx 的回复:]

用这个方法关闭,100%成功,你的那个是要进程正常退出,因此失败。
C# code

[Flags]
public enum ProcessAccessFlags : uint
{
All = 0x001F0FFF,
Terminate = 0x00000001,
Crea……
[/Quote]

为啥正常关闭进程不行!楼上能解释下,跪谢!

qldsrx 2012-01-31
  • 打赏
  • 举报
回复
用这个方法关闭,100%成功,你的那个是要进程正常退出,因此失败。

[Flags]
public enum ProcessAccessFlags : uint
{
All = 0x001F0FFF,
Terminate = 0x00000001,
CreateThread = 0x00000002,
VMOperation = 0x00000008,
VMRead = 0x00000010,
VMWrite = 0x00000020,
DupHandle = 0x00000040,
SetInformation = 0x00000200,
QueryInformation = 0x00000400,
Synchronize = 0x00100000
}

[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwProcessId);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetExitCodeProcess(IntPtr hProcess, out uint lpExitCode);

private void KillProcess(string processId,string processName)
{
IntPtr killer;
try
{
killer = OpenProcess(ProcessAccessFlags.All, false, uint.Parse(processId));
MessageBox.Show(killer.ToString());
uint exitcode = 0;
bool ret = GetExitCodeProcess(killer, out exitcode);
ret = TerminateProcess(killer, exitcode);
if (ret)
MessageBox.Show(string.Format("成功关闭程序{0}。", processName));
else
{
exitcode = 0;
MessageBox.Show(string.Format("杀死进程{0}时失败,原因不明。", processName));
}
}
catch (Exception Exc)
{
MessageBox.Show(string.Format("杀死进程{0}时失败,原因是{1}。", processName, Exc.Message));
}
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧