Тема: AHK: Хук DirectX 11 и добавление надписи
Тема для обсуждения "Хук DirectX 11 и добавление надписи".
http://forum.script-coding.com/viewtopic.php?id=17672
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Тема для обсуждения "Хук DirectX 11 и добавление надписи".
http://forum.script-coding.com/viewtopic.php?id=17672
Руки чешутся поюзать! Жаль, времени нету.
А можно подробнее, что именно программа делает?
Какая именно программа?
Если вы имеете в виду этот код, то inject.ahk, запускает программу GFXTest.exe (программа, использующая directx движок), после чего инжектит в неё autohotkey.dll и запускает уже в ней код minhook.ahk.
Для перехвата вывода изображения в directx11 нам надо найти адрес IDXGISwapChain_Present метода.
https://docs.microsoft.com/en-us/window … in-present
Для этого мы создаём D3d11 устройство и получаем хендл на swap chain.
https://docs.microsoft.com/en-us/window … dswapchain
Потом высчитываем адрес метода present у swap chain.
После чего устанавливаем на этот адрес хук с помощью minhook.dll.
В самом хуке мы узнаем высоту, ширину свепчейна, хендл связанного с ним устройства и для добавления текста находим хендл на ID3D11DeviceContext interface:
https://docs.microsoft.com/en-us/window … icecontext
Потом создаем текст через FW1FontWrapper.dll и накладываем его на ID3D11DeviceContext interface.
После чего выводим получившиеся изображение на экран.
Спасибо за подробности, но сначала меня интересует практический момент. Можно выводить любые символы поверх игры работающей на DirectX11? А что ещё можно? Например, использовать как wallhack или что-то ещё?
Я на играх не тестировал.
Думаю, там возможен ряд защит.
Кстати, надо бы скачать какую-нибудь и протестировать.
Символы можно любые.
Думаю, что эти хаки используют также перехват Directx и шаманство с текстурами.
В общем скачал пару игр для теста.
Пока получается следующее:
1) Если игра написана на движке Unity, то в полноэкранном режиме надпись пропадает.
2) Если на игре используется стимовский оверлей, то хук не ставится - видно стим сам ее хукает.
Чтобы следить за изменением размера игры нужно еще хукать IDXGISwapChain_ResizeBuffers.
Код в первом посте переписал и вставил проверку на совпадение битностей автохотки, всех длл и исходной программы.
Так то оверлеев много существует: от банальных фрапсов/шадоуплэй до овервульфов и тех самых стимов. Потому я думаю для использования ahk скриптов в качестве оверлея все же лучше использовать соответствующую наработку. Есть даже версия с поддержкой кириллицы, однако она приводила к крашу игру, в которой я её использовал.
Меня другое интересует: получается эта библиотека как бы перехватывает изображение, которое рендерится на мониторе? Возможно неправильно объяснил, я в терминологии все же не силен, но с помощью этой библиотеки можно захватывать моментальные скриншоты полноэкранных приложений?
Фрапс далеко не банален.
Соответствующая нароботка только для directx9.
Скриншоты, думаю, конечно, получится, но не совсем правильно.
Правильно обрабатывать скриншоты в отдельном потоке, чтоб меньше тормозило, но я не знаю, как его запустить уже из инжектнутого приложения.
Автоитовцы молодцы - сделали враппер ImGui.
https://www.autoitscript.com/forum/topi … dvanced-ui
Теперь при некотором усердии можно создавать своё гуи поверх полноэкранных приложений.
https://niemand.com.ar/2019/01/01/how-t … -11-imgui/
А ImGui тоже работает в указанном окне, или он может работать автономно?
Не понял вопрос.
Ну ImGui рисует меню поверх окон? А в автоит тоже так? Наверное, да. Просто я ищу меню типо imgui, но чтобы оно не внедрялось в окно. Видимо, так нельзя сделать, нужно еще создавать winapi окно.
Что значит не внедрялось в окно.
ImGui создает свое окно.
Ну оно создает свое окно поверх другого окна. Получается - это меню только внедряется в чужие окна, а как самостоятельное окно оно не работает.
Посмотрите пример на автоит. Там никакого другого окна нету.
Есть, вот:
Так это все создается библиотекой imgui, без внедрения в чужие окна.
Почти - это создает винапи окно, а imgui рисует уже в этом окне меню. Но хотелось бы без дополнительных окон чтобы отображалась gui imgui.
Гуглить, как спрятать главное окно. Может достаточно не показывать его?
_WinAPI_ShowWindow($hwnd)
Оптимальный вариант, спросить у автора автоитовского враппера.
Я эту библиотеку подробно не изучал, да и компа под рукой нет.
Так ведь скрыв главное окно, скроется и imgui окно? Нет?
Ну вот и протестируйте.
Хорошо, протестирую. Так спросил уже. Только по библиотеки Imgui - не автоит. Ответ нужно ждать только, и не факт, что ответят.
Ну можно и самому решение найти и попробовать реализовать на автоит.
https://github.com/ocornut/imgui/issues/225
Не очень понимаю, в чём проблема. Если там есть какое-то Main Gui, то просто сделать его по размеру внутреннего окна.
А если внутреннее окно меняет свой размер, открывается/закрывается/перетаскивается?
По моей сссылке написано, что надо сделать.
С прозрачностью окна пишут, что внутреннее меню тоже становится прозрачным.
Нашел еще ответ по imgui:
@Voltz в вашем InitInstance()
после вызова CreateWindow()
сделать
SetWindowLong(hwnd, GWL_STYLE, 0);
перед вызовом ShowWindow()
Вот мой вопрос: https://github.com/Immediate-Mode-UI/Nuklear/issues/162. Там не та библиотека, но она как-раз и нужна, т.к. через GDI++ рисует меню. Впринципе, вариант рисовать поверх главного окна тоже неплохо, просто не ожидал, что так GUI рисуются, поверх главных окон.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться