Перейти к содержанию

постоянный мониторинг значения через ReadProcessMemory в C#


Рекомендуемые сообщения

Добрый день, мало-помалу разбираюсь в чтении значений из игры. Есть несколько нубских вопросов, надюсь можно их тут задавать.  Хотел узнать: постоянное слежение за значением в игре делается через циклы или как нибудь еще можно реализовать в C#. И еще есть кусочек кода:

 public static int ReadBytes(long baseAdress, ushort[] offsets)
        {
            if (pID != 0  && offsets.Length != 0)
            {
                byte[] buffer = new byte[5];
                var bytesread = new UIntPtr();
                var handle = OpenProcess(0x001F0FFF, false, pID);
                ReadProcessMemory(handle, (IntPtr)baseAdress, buffer, 5, out bytesread);
                for (int i = 0; i < offsets.Length; i++)
                {
                    baseAdress = BitConverter.ToUInt32(buffer, 0);
                    baseAdress += offsets[i];
                    ReadProcessMemory(handle, (IntPtr)baseAdress, buffer, 5, out bytesread);
                }
                var result = buffer;
                CloseHandle(handle);
               return BitConverter.ToInt32(buffer, 0);
            }
            return 0;
        }

который считывает значение, если его задействовать в цикле то он постоянно будет отрывать и закрывать процесс. Это так и делается или открывать в начале цикла и закрывать уже перед закрытием проги? Благодарю.

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, nJammi сказал:

постоянное слежение за значением в игре делается через циклы или как нибудь еще можно реализовать в C#

Через циклы, ага. А можно и каким-нибудь фоновым воркером асинхронно это делать. Но это пока не твой уровень, раз у тебя возникают такие вопросы. В будущем обязательно разберешься ) 

 

8 часов назад, nJammi сказал:

если его задействовать в цикле то он постоянно будет отрывать и закрывать процесс. Это так и делается или открывать в начале цикла и закрывать уже перед закрытием проги

Ты можешь открыть процесс перед стартом цикла и закрыть его по завершении цикла. А можешь открыть процесс при старте твоего трейнера, а закрыть перед выходом из трейнера - на твое усмотрение. Думаю, второй вариант будет предпочтительнее, если ты собираешься делать больше одного цикла (то есть, мониторить/морозить больше одного значения)

Ссылка на комментарий
Поделиться на другие сайты

Еще раз здравствуйте. Можно ли отправлять нажатие клавиш в конкретное приложение в фоновом режиме на c#?

 

Слизал таки код для работы в ассинхронном режиме, если кто любит поучать как правильно писать код то можете глянуть ошибки оформления(или как правильно)? Так он рабочий.

Спойлер

 public partial class Form1 : Form
    {
       public string process;
       Mem mem = new();
       public uint MaxHp;
       public uint Hp;
       public uint MaxMp;
       public uint Mp;
       public uint HoldMp;
       public uint CurrMp;


        public Form1()
        {
            InitializeComponent();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        
        }
         
        private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                if (ProccessNameLabel.Text != "")
                {
                    process = ProccessNameLabel.Text;
                }
                else
                {
                    Thread.Sleep(1000);
                    return;
                }
                  
                if (!mem.OpenProcess(process))
                {
                    Thread.Sleep(1000);
                    return;
                }

                MaxHp = GetVal("base+0x024323C8,0x298,0x80,0x278");
                Hp = GetVal("base+0x024323C8,0x298,0x80,0x280");
                MaxMp = GetVal("base+0x024323C8,0x2A0,0x80,0x278");
                Mp = GetVal("base+0x024323C8,0x2A0,0x80,0x280");
                HoldMp = GetVal("base+0x024323C8,0x2A0,0x80,0x298");
                CurrMp = MaxMp - HoldMp;


                if (Hp !<= 0 && Hp <= MaxHp*49/100) SendKeys.SendWait("1");
                if (Mp !<= 0 &&  CurrMp < 45) SendKeys.SendWait("2");

                Thread.Sleep(100);
                BgWorker.ReportProgress(0);
            }

        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            BgWorker.RunWorkerAsync();
        }

        private void BgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            
            ProcOpenLabel.Text = "Game Found";
            MaxHpLabel.Text = MaxHp.ToString();
            HpLabel.Text = Hp.ToString();
            MaxMpLabel.Text = MaxMp.ToString();
            MpLabel.Text = Mp.ToString();
            HoldMpLabel.Text = HoldMp.ToString();
        }

        private void BgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            BgWorker.RunWorkerAsync();
        }

        public uint GetVal(string address)
        {
            return mem.ReadUInt(address);
        }
    }

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.