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

постоянный мониторинг значения через 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);
        }
    }

 

 

 

Поделиться сообщением


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр

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

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

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