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

nJammi

Стажёры
  • Постов

    2
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные nJammi

  1. Еще раз здравствуйте. Можно ли отправлять нажатие клавиш в конкретное приложение в фоновом режиме на 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);
            }
        }

     

     

     

  2. Добрый день, мало-помалу разбираюсь в чтении значений из игры. Есть несколько нубских вопросов, надюсь можно их тут задавать.  Хотел узнать: постоянное слежение за значением в игре делается через циклы или как нибудь еще можно реализовать в 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;
            }

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

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

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

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