具有适用于 memory.dll c# 的进程的组合框

Posted

技术标签:

【中文标题】具有适用于 memory.dll c# 的进程的组合框【英文标题】:Combo box with processes that works for memory.dll c# 【发布时间】:2021-08-03 08:22:23 【问题描述】:

我知道有一个类似的问题,但请先阅读

我使用的是 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 返回 null。

【问题讨论】:

【参考方案1】:

根据我的测试,我重现了您的问题。

首先,我建议你使用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);
        

对其进行测试:

【讨论】:

我不知道该怎么做,因为我知道有 3 个同名进程,在作弊引擎中我选择了一个是正确的,它显示了我的值,但是用这个 c# 它说找不到该值,这意味着它正在使用其他两个同名进程之一 @José Antonio,看来你想根据组合框找到对应的进程。我已经更新了我的代码,你可以试试。 我已经检查过了,我几乎可以肯定组合框没有显示具有相同名称的进程,因为我一直在搜索,而作弊引擎却找不到其他进程它没有任何问题。如果我尝试那里出现的过程,它会说找不到我的指针 再调查一下,我发现这两个进程都在那里,但它说它没有找到我的指针,而作弊引擎做得很好 我的错,我的项目必须是 x86,我尝试不使用您的代码但它不起作用,所以您的回复很有帮助,谢谢。

以上是关于具有适用于 memory.dll c# 的进程的组合框的主要内容,如果未能解决你的问题,请参考以下文章

具有语法突出显示的文本框/富文本框? [C#] [关闭]

c#:具有多个应用程序域的单个进程 VS 多个进程

部分视图部分适用于 JQuery,但不完全适用于 C# ASP.Net MVC 5

在 C# 中启动具有不同 DLL 路径的进程

如何区分具有相同名称的多个进程并杀死所有在 C# 中以我的 USERNAME 运行的进程?

HttpClient post call 适用于邮递员,但不适用于 C#