  | 
	
		
	
	
		Крашит клиент при выборе сервера - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок | 
	 
	 
	
	
	
	
	
	
	
	
	
	
	
		 
	 
 
	
	
		
	
	
    
        
            
             
            31.07.2017, 14:53
            
            
         | 
        
             
            #1
            
         | 
    
 
    
    
  
    | 
    
     | 
     
  
    | 
    
     | 
    
    
     | 
   
  
    
        Разведчик  
     | 
     
 
    
      
  
            
    
      
    
            
                 Регистрация: 11.10.2010  
                
                
                
                 Сообщений: 13
                   
 Популярность: 10  
                  
	 Сказал(а) спасибо: 3  
	
		
			
				Поблагодарили 5 раз(а) в 5 сообщениях
			
		
	 
     
 
             
                
               
                
       
                  
     | 
    
    
    
        
        
            
            
                 
                Крашит клиент при выборе сервера
             
             
            
        
        
        
            
               
    Всем привет. Практически дописал свой автологин. Все работает отлично: авторизуется, сохраняет токен при двухфакторной авторизации, но есть одно но... 
При попытке выбрать сервер клиент крашится в светофор. Но что самое странное, так это то, что происходит это не всегда, но в большинстве случаев.  
Сначала я грешным делом подумал, что достаточно будет поставить задержку, но это не помогает. Однако при пошаговом выполнении кода сервер выбирается...  
Помогите, пожалуйста, не могу понять, в чем дело. Ниже код метода авторизации в клиенте.
 
	Код: 
	private static async Task EntranceToGame(Int32 processId, Account user)
{
      try
      {
           //открываем процесс для чтения и записи
           IntPtr oph = WinApi.OpenProcess(WinApi.ProcessAccessFlags.All, false, processId);
           //дожидаемся, пока прогрузится окно, если прошла минута, то выбрасываем исключение
           Int32 tempCount = 0;
           do
           {
               await Task.Delay(1000);
               tempCount++;
               if (tempCount > 60) throw new Exception("Проблемы с запуском окна.");
           }
           while (CalcMethods.ReadByte(oph, Offsets.BaseAdress, new Int32[] { 0x1C, 0x18, 0x08, 0x8C, 0x08, 0x90 }) != 1);
           //выбираем сервер
           Int32[] addresses = CalcMethods.CalcControlAddress(oph, "Win_LoginServerList", "Lst_Server", 1);
           for (int i = 0; i < 13; i++)
           {
               if (CalcMethods.ReadString(oph, addresses[2] + 0x168, new int[] { i * 0x800, 0 }).Contains(user.Server))
               {
                   if (CalcMethods.CalcByteValue(oph, addresses[2] + 0x13c) != i)
                       CalcMethods.WriteProcessBytes(oph, i, addresses[2] + 0x13c);
                        
                   await Task.Delay(3000);
                   //вот в этом месте клиент крашится.
                   Injects.GUI_Inject(addresses[0], addresses[1], oph);
                   break;
               }
            }
            //ждем коннекта и нажимаем "ОК" на всплывающем информационном окне
            addresses = CalcMethods.CalcControlAddress(oph, "Win_PwdHint", "Btn_Confirm", 1);
            tempCount = 0;
            do
            {
                await Task.Delay(1000);
                tempCount++;
                if (tempCount > 60) throw new Exception("Проблемы с коннектом к серверу.");
            }
            while (CalcMethods.CalcByteValue(oph, addresses[0] + 0x90) != 1);
            Injects.GUI_Inject(addresses[0], addresses[1], oph);
            //выбираем персонажа
            String tempName = String.Empty;
            for (Int32 i = 1; i <= 8; i++)
            {
                addresses = CalcMethods.CalcControlAddress(oph, "Win_Select", "Txt_Name" + i.ToString(), 2);
                tempName = CalcMethods.ReadString(oph, addresses[2] + 0xB8, new int[] { 0 });
                if (CalcMethods.ReadString(oph, addresses[2] + 0xB8, new int[] { 0 }).Contains(user.Nickname))
                {
                    addresses = CalcMethods.CalcControlAddress(oph, "Win_Select", "Rdo_Char" + i.ToString(), 2);
                    Injects.GUI_Inject(addresses[0], addresses[1], oph);
                }
             }
      }
      catch(Exception ex)
      {
           throw new Exception(ex.Message);
       }
}
 
     
         
        
        
        
        
        
        
        
        
            
                 
                
                    
                        Последний раз редактировалось KLAIDY; 31.07.2017 в 14:57.
                    
                    
                
             
        
        
      | 
 
    | 
        
        
        
        
         
     | 
    
    
    
        
        
        
        
             
        
        
        
        
        
        
        
            
        
        
        
     | 
 
 
 
  
	 
	
		 
	 
 
	
	
		
	
	
    
        
            
             
            02.08.2017, 11:08
            
            
         | 
        
             
            #2
            
         | 
    
 
    
    
  
    | 
    
     | 
     
  
    | 
    
     | 
    
    
     | 
   
  
    
        Разведчик  
     | 
     
 
    
      
  
            
    
      
    
            
                 Регистрация: 11.10.2010  
                
                
                
                 Сообщений: 13
                   
 Популярность: 10  
                  
	 Сказал(а) спасибо: 3  
	
		
			
				Поблагодарили 5 раз(а) в 5 сообщениях
			
		
	 
     
 
             
                
               
                
       
                  
     | 
    
    
    
        
        
            
            
                 
                Re: Крашит клиент при выборе сервера
             
             
            
        
        
        
            
               
    В общем так и не разобрался, что это за светофор такой, поэтому решил просто посылать в окно нажатие мышки. 
	Код: 
	addresses = CalcMethods.CalcControlAddress(oph, "Win_LoginServerListButton", "Btn_Choose", 1);
                        WinApi.SendMessage(hwnd, 0x201, 0x1, (IntPtr)(((CalcMethods.CalcInt32Value(oph, addresses[0] + 0x9C) + CalcMethods.CalcInt32Value(oph, addresses[2] + 0x90) + 2) << 16) 
                            | (CalcMethods.CalcInt32Value(oph, addresses[0] + 0x98) + CalcMethods.CalcInt32Value(oph, addresses[2] + 0x88) + 2) & 0xffff));
                        WinApi.SendMessage(hwnd, 0x202, 0x1, (IntPtr)(((CalcMethods.CalcInt32Value(oph, addresses[0] + 0x9C) + CalcMethods.CalcInt32Value(oph, addresses[2] + 0x90) + 2) << 16) 
                            | (CalcMethods.CalcInt32Value(oph, addresses[0] + 0x98) + CalcMethods.CalcInt32Value(oph, addresses[2] + 0x88) + 2) & 0xffff));
 А сам заход в игру делать передачей нажатия энтера.
 
	Код: 
	WinApi.SendMessage(hwnd, WinApi.WM_SETFOCUS, 0, IntPtr.Zero);
                WinApi.PostMessage(hwnd, WinApi.WM_KEYDOWN, 13, 0);
 
     
         
        
        
        
        
        
        
        
     | 
 
    | 
        
        
        
        
         
     | 
    
    
    
        
        
        
        
             
        
        
        
        
        
        
        
            
        
        
        
     | 
 
 
 
  
	 
	
		 
	 
 
 
	
		
	
	
	
	
	
		
	
		 
		Ваши права в разделе
	 | 
 
	
		
		Вы не можете создавать новые темы 
		Вы не можете отвечать в темах 
		Вы не можете прикреплять вложения 
		Вы не можете редактировать свои сообщения 
		 
		
		
		
		
		HTML код Выкл. 
		 
		
	  | 
 
 
	 | 
	
		
	 | 
 
 
 
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 09:36. 
		 
	 
 
 | 
  |