[hr]Многие задавались вопросом, как же рисовать оверлеем на C#, если толкового примера на этом ЯП найти не так уж и легко, сегодня поделюсь с вами такой хернюшкой)))[hr]Кода в уроке будет по минимуму, дабы вы ручками развивались. Покажу я вам на самом беспалевном примере на свете) рисовать мы будем на рабочем столе. [hr]Умники возникнут с понтом: "ну а если я захочу рисовать по верх окна игры??" - этот момент я тоже постараюсь разжевать, там всё банально просто.[hr]Все импорты из User32.dll Для этого урока вам придется потрахать гугл (да да, гугл). Насилуем по следующим запросам: "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) В чем прикол: мы будем проверять, является ли нужное нам окно, активным в данный момент и если является - рисовать только в нем) Добавляем в наш код следующее: Код: int PID = 0; //тут будем хранить айдишник нашего процесса int getPID()//тут получим айди нужного нам процесса { return Process.GetProcessesByName("имя процесса")[0].Id; } [hr]Дальше в зацикленный поток или таймер: Код: IntPtr hActive = GetForegroundWindow(); //Получаем хендл активного окна GetWindowThreadProcessId(hActive, out PID);//записываем в переменную ID процесса активного окна if(PID == this.getPID())//проверяем равен ли айди активного процесса, айдишнику нашего { //аля бомбея, малюем } [hr]На этом фаст курс я и закончу, понимаю, что урок не самый понятный, но после долгого дня, я очень устал и решил сделать ставку на ваш интелект и интерес этим вопросом, если нужны детали или исходник с примером, напишите в комментариях. Писал без компилятора под рукой, могут быть ошибки. Почему я не затронул ReleaseDC? думайте) Всем удачки. (Данный урок был опубликован мною ранее на другом форуме, та как на этом висел спаммер)
А еще для нормальной работы SetWindowLong,MoveWindow,SetWindowPos,DwmExtendFrameIntoClientArea,GetClientRect и тд.... но это если нормально захочется сделать))