具有适用于 memory.dll c# 的进程的组合框
Combo box with processes that works for memory.dll c#
我知道有一个类似的问题,但请先阅读
我正在使用 Windows 10 x64
我正在用 memory.dll 在 c# 中写一些东西,所以我想显示过程,然后在用户选择的过程中用 memory.dll 写一个值。
public partial class Form1 : Form
{
public Mem m = new Mem();
public Form1()
{
InitializeComponent();
loadprocess();
}
private void loadprocess()
{
comboBox1.Items.Clear();
Process[] MyProcess = Process.GetProcesses();
for (int i = 0; i < MyProcess.Length; i++)
comboBox1.Items.Add(MyProcess[i].ProcessName + "-" + MyProcess[i].Id);
}
private void timerDontCamera_Tick(object sender, EventArgs e)
{
m.OpenProcess(Process.GetProcessesByName(comboBox1.SelectedValue.ToString()).FirstOrDefault().Id);
m.WriteMemory("zVideoUI.dll+003BED80,68,E4", "byte", "1");
}
问题出在这一行:
m.OpenProcess(Process.GetProcessesByName(comboBox1.SelectedValue.ToString()).FirstOrDefault().Id);
m.WriteMemory("zVideoUI.dll+003BED80,68,E4", "byte", "1");
抛出异常:System.NullReferenceException:'Object reference not set to an instance of an object.'
System.Windows.Forms.ListControl.SelectedValue.get 返回空值。
根据我的测试,我重现了你的问题。
首先,我建议您使用comboBox1.SelectedItem
代替comboBox1.SelectedValue
。
其次,如果要使用Process.GetProcessesByName
方法,我们应该获取进程名称。但是,您的 comboBox
所选项目应该是 processname
+ process.id
.
最后,您可以尝试以下代码获取正确的Id。
public Form1()
{
InitializeComponent();
loadprocess();
timer1.Interval = 1000;
}
private void loadprocess()
{
comboBox1.Items.Clear();
Process[] MyProcess = Process.GetProcesses();
for (int i = 0; i < MyProcess.Length; i++)
{
comboBox1.Items.Add(MyProcess[i].ProcessName + "-" + MyProcess[i].Id);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
string processname = comboBox1.SelectedItem.ToString().Split('-').First();
string id = comboBox1.SelectedItem.ToString().Split('-').Last();
var process = Process.GetProcessesByName(processname).Where(i=>i.Id==Convert.ToInt32(id)).First();
Console.WriteLine(process.Id);
m.OpenProcess(process.Id);
}
对其进行测试:
我知道有一个类似的问题,但请先阅读
我正在使用 Windows 10 x64
我正在用 memory.dll 在 c# 中写一些东西,所以我想显示过程,然后在用户选择的过程中用 memory.dll 写一个值。
public partial class Form1 : Form
{
public Mem m = new Mem();
public Form1()
{
InitializeComponent();
loadprocess();
}
private void loadprocess()
{
comboBox1.Items.Clear();
Process[] MyProcess = Process.GetProcesses();
for (int i = 0; i < MyProcess.Length; i++)
comboBox1.Items.Add(MyProcess[i].ProcessName + "-" + MyProcess[i].Id);
}
private void timerDontCamera_Tick(object sender, EventArgs e)
{
m.OpenProcess(Process.GetProcessesByName(comboBox1.SelectedValue.ToString()).FirstOrDefault().Id);
m.WriteMemory("zVideoUI.dll+003BED80,68,E4", "byte", "1");
}
问题出在这一行:
m.OpenProcess(Process.GetProcessesByName(comboBox1.SelectedValue.ToString()).FirstOrDefault().Id);
m.WriteMemory("zVideoUI.dll+003BED80,68,E4", "byte", "1");
抛出异常:System.NullReferenceException:'Object reference not set to an instance of an object.'
System.Windows.Forms.ListControl.SelectedValue.get 返回空值。
根据我的测试,我重现了你的问题。
首先,我建议您使用comboBox1.SelectedItem
代替comboBox1.SelectedValue
。
其次,如果要使用Process.GetProcessesByName
方法,我们应该获取进程名称。但是,您的 comboBox
所选项目应该是 processname
+ process.id
.
最后,您可以尝试以下代码获取正确的Id。
public Form1()
{
InitializeComponent();
loadprocess();
timer1.Interval = 1000;
}
private void loadprocess()
{
comboBox1.Items.Clear();
Process[] MyProcess = Process.GetProcesses();
for (int i = 0; i < MyProcess.Length; i++)
{
comboBox1.Items.Add(MyProcess[i].ProcessName + "-" + MyProcess[i].Id);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
string processname = comboBox1.SelectedItem.ToString().Split('-').First();
string id = comboBox1.SelectedItem.ToString().Split('-').Last();
var process = Process.GetProcessesByName(processname).Where(i=>i.Id==Convert.ToInt32(id)).First();
Console.WriteLine(process.Id);
m.OpenProcess(process.Id);
}
对其进行测试: