[C#] Оверлей

Тема в разделе "Создания ПО", создана пользователем iDReeM!, 26 окт 2015.

  1. iDReeM!

    iDReeM! Active Member Команда форума

    Репутация:
    0
    Регистрация:
    5 дек 2013
    Сообщения:
    3.168
    Симпатии:
    3
    [hr]
    Приветствую читатель! [hr]Некоторые задавались вопросом, как же рисовать оверлеем на C#, если толкового примера на этом ЯП найти не так уж и легко, сегодня поделюсь с вами такой хернюшкой !)0 [hr]В чем прикол: Оверлей не палится на видео :)
    [hr]Кода в уроке будет по минимуму, дабы вы ручками развивались.

    Покажу я вам на самом беспалевном примере на свете. *(рисовать мы будем на рабочем столе) [hr]Умники возникнут с понтом: "ну а если я захочу рисовать по верх окна игры??" - этот момент я тоже постараюсь описать, там всё банально просто.

    Все импорты из User32.dll[hr]Для этого урока вам придется потрахать гугл (да да, гугл).

    Насилуем по следующим запросам:

    "C# GetDC, C# ReleaseDC, C# FindWindow, C# GetWindowRect, C# GetForegroundWindow, C# GetWindowThreadProcessId"[hr]Прицепимся мы к рабочему столу по следующему принципу: (ясен хyй в таймере или зацикленом потоке)
    Код:
    Graphics pDevice = Graphics.FromHdc(GetDC(IntPtr.Zero));
    [hr]Дальше мы уже можем рисовать че хотим: (на примере вывода строки)
    Код:
    void PrintString(string Text, int x, int y, Color dwColor , Graphics pDevice)
    
    {
    
        //если девайса нету, ретурним дабы не было обрабатываемого исключения.
    
        if(pDevice == null)
    
            return;
    
    
    
        pDevice.DrawString(Text, new Font("Tahoma", 10F, FontStyle.Bold), new SolidBrush(dwColor), x, y);
    
    }
    Кому то покажется что я не объяснив как получить указатель на девайс сразу перешел к дравингу (рисовке), но нет, расчёт на ваши мозги)[hr]Вывели мы строку, отлично, теперь нам нужно уцепится за окошко игры, для чего мы и воспользуемся такими функциями как FindWindow и GetWindowRect. В потоке или таймере химичим следующее условие:
    Код:
    Rectangle WindowRect = new Rectangle();
    
    IntPtr hWindow = FindWindow("класс окна", "Заголовок окна, можно одно из двух (на ваше усмотрение)");
    
    //если искомое окно существует
    
    if(hWindow != IntPtr.Zero)
    
    {
    
        //Получаем его кординаты
    
        GetWindowRect(hWindow, ref WindowRect);
    
        //Тут мы уже имея координаты окна можем на нём рисовать))
    
        PrintString("Example Text", WindowRect.X + 30, WindowRect.Y + 30, Color.Green, pDevice);//Девайс как получать выше написал.
    
    }
    [hr]Вот мы и нарисовали поверх окна на рабочем столе и столкнулись с следующим вопросом: "а как сделать так, чтобы НЕ рисовалось поверх других активных окон, а только поверх нужного нам??" и тут же вы получаете решение, для этого мы используем следующие функции: GetForegroundWindow, GetWindowThreadProcessId.

    Суть в чем: мы будем проверять, является ли нужное нам окно, активным в данный момент и если является - рисовать только в нем...[hr]Добавляем в наш код следующее:
    Код:
    int PID = 0; //тут будем хранить айдишник нашего процесса
    
    int getPID()//тут получим айди нужного нам процесса
    
    {
    
     return Process.GetProcessesByName("имя процесса")[0].Id;
    
    }
    Дальше в зацикленный поток или таймер:
    Код:
    IntPtr hActive = GetForegroundWindow(); //Получаем хендл активного окна
    
    GetWindowThreadProcessId(hActive, out PID);//записываем в переменную ID процесса активного окна
    
    if(PID == this.getPID())//проверяем равен ли айди активного процесса, айдишнику нашего
    
    {
    
    //аля бомбея, малюем
    
    }
    На этом фаст курс я и закончу, понимаю, что урок не самый понятный, ибо я решил сделать ставку на ваш интелект и интерес этим вопросом, если нужны детали или исходник с примером, напишите в комментариях.

    Писал без компилятора под рукой, могут быть ошибки. Почему я не затронул ReleaseDC? думайте или гуглите)

    Будет пахать как в КС ГО, так и в тысячах других игр. Всем удачки.

     
  2. DuBStepPlanet.13th

    DuBStepPlanet.13th New Member

    Репутация:
    0
    Регистрация:
    20 июн 2013
    Сообщения:
    1.746
    Симпатии:
    0
    С Возвращением братка
     
  3. iDReeM!

    iDReeM! Active Member Команда форума

    Репутация:
    0
    Регистрация:
    5 дек 2013
    Сообщения:
    3.168
    Симпатии:
    3
    ага, пасибо
     
  4. Лысый из Браззерс

    Лысый из Браззерс New Member

    Репутация:
    0
    Регистрация:
    24 сен 2015
    Сообщения:
    160
    Симпатии:
    0
    то чуство когда прочитав половину, ничего не понял .
     
  5. DuBStepPlanet.13th

    DuBStepPlanet.13th New Member

    Репутация:
    0
    Регистрация:
    20 июн 2013
    Сообщения:
    1.746
    Симпатии:
    0
    Чтоб это понять,надо хоть чуточку программирование знать)
     
  6. Лысый из Браззерс

    Лысый из Браззерс New Member

    Репутация:
    0
    Регистрация:
    24 сен 2015
    Сообщения:
    160
    Симпатии:
    0
    пойду книги куплю
     
  7. iDReeM!

    iDReeM! Active Member Команда форума

    Репутация:
    0
    Регистрация:
    5 дек 2013
    Сообщения:
    3.168
    Симпатии:
    3
    не обязательно, имея желание, в этом разберётся даже домохозяйка.
     
  8. Лысый из Браззерс

    Лысый из Браззерс New Member

    Репутация:
    0
    Регистрация:
    24 сен 2015
    Сообщения:
    160
    Симпатии:
    0
    есть какие то обучающие программы для новичков ? [​IMG]
     
  9. DuBStepPlanet.13th

    DuBStepPlanet.13th New Member

    Репутация:
    0
    Регистрация:
    20 июн 2013
    Сообщения:
    1.746
    Симпатии:
    0
    На первом курсе имел желание (
     
  10. iDReeM!

    iDReeM! Active Member Команда форума

    Репутация:
    0
    Регистрация:
    5 дек 2013
    Сообщения:
    3.168
    Симпатии:
    3
    в ютубе поищи, их куча.
     
  11. Under

    Under Active Member

    Репутация:
    0
    Регистрация:
    18 июн 2012
    Сообщения:
    2.339
    Симпатии:
    4
    Круть пойду в кодыры
     
  12. iDReeM!

    iDReeM! Active Member Команда форума

    Репутация:
    0
    Регистрация:
    5 дек 2013
    Сообщения:
    3.168
    Симпатии:
    3
    iDReeM!,
     

Поделиться этой страницей