zorinchel Опубликовано 1 октября, 2019 Поделиться Опубликовано 1 октября, 2019 (изменено) Привет! Может кто-нибудь подскажет как нормально вывести окно одной игры поверх другой, а то у меня получается совсем не то что нужно Спойлер #include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #include <tlhelp32.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } DWORD WINAPI GtaSA_thread(LPVOID) { { for (;; Sleep(1000)) { if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000) { ShellExecute(NULL, "open", "c:\\GSR_1.5\\GAMES\\MK4\\MK4.exe", NULL, NULL, SW_SHOWMAXIMIZED); } } } } вот что получилось в итоге Изменено 1 октября, 2019 пользователем zorinchel Ссылка на комментарий Поделиться на другие сайты Поделиться
DaVilka Опубликовано 1 октября, 2019 Поделиться Опубликовано 1 октября, 2019 43 минуты назад, zorinchel сказал: как нормально вывести окно одной игры поверх другой Ты не выведешь другое окно поверх первого если первое находится в полноэкранном режиме без жесткого вмешательства в процесс игры. Своим кодом ты просто запускаешь новый процесс. Простой вариант - запустить первую игру в оконном режиме, убрать рамку и масштабировать в расширение экрана и уже по верх него запускать другое окно, но опять же в виндовсе может быть активным только одно окно. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
zorinchel Опубликовано 25 декабря, 2019 Автор Поделиться Опубликовано 25 декабря, 2019 Есть код, который выводит текст поверх приложения Спойлер #include <d3d9.h> #include <d3dx9.h> #include <d3dx9core.h> #pragma comment(lib,"d3d9.lib") #pragma comment(lib, "winmm") #pragma comment(lib, "D3dx9.lib") typedef HRESULT(__stdcall* PRESENT9)(IDirect3DDevice9* pDevice, const RECT*, const RECT*, HWND, void*); PRESENT9 g_D3D9_Present = 0; BYTE g_codeFragment_p9[5] = { 0, 0, 0, 0, 0 }; BYTE g_jmp_p9[5] = { 0, 0, 0, 0, 0 }; DWORD present9 = 0; bool indicator = 0; D3DRECT rec = { 10, 10, 160, 240 }; //menu size ID3DXFont* m_font = 0; RECT fontRect = { 10, 15, 120, 120 }; D3DCOLOR fontColor = 0; D3DCOLOR bkgColor = 0; void DrawIndicator(void* pDevice) { IDirect3DDevice9* dev = (IDirect3DDevice9*)pDevice; //get the actual D3D-device dev->BeginScene(); if (indicator) { HDC hdc = GetDC(0); RECT rect = { 20, 20, 200, 200 }; SetTextColor(hdc, RGB(255, 0, 0)); SetBkMode(hdc, TRANSPARENT); SetBkColor(hdc, RGB(0, 255, 0, 0)); DrawText(hdc, L"Directx Hook", -1, &rect, DT_LEFT); } dev->EndScene(); } //get the VMT and the hooking functions offsets void GetDevice9Methods() { IDirect3D9* d3d9_ptr; IDirect3DDevice9* pDevice; DWORD* vtablePtr; D3DPRESENT_PARAMETERS d3dpp; static HMODULE d3d9_handle = 0; HWND hWnd = CreateWindowExA(0, "STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0); d3d9_handle = LoadLibraryA("d3d9.dll"); d3d9_ptr = Direct3DCreate9(D3D_SDK_VERSION); ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = 1; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; IDirect3D9_CreateDevice(d3d9_ptr, 0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice); vtablePtr = (DWORD*)(*((DWORD*)pDevice)); present9 = vtablePtr[17] - (DWORD)d3d9_handle; IDirect3DDevice9_Release(pDevice); IDirect3D9_Release(d3d9_ptr); FreeLibrary(d3d9_handle); CloseHandle(hWnd); } HRESULT HookedPresent9(IDirect3DDevice9* pDevice, const RECT* src, const RECT* dest, HWND hWnd, void* unused) { BYTE* codeDest = (BYTE*)g_D3D9_Present; //restore the original Present() bytes codeDest[0] = g_codeFragment_p9[0]; *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1)); DrawIndicator(pDevice); //draw the menu DWORD res = g_D3D9_Present(pDevice, src, dest, hWnd, unused); //place the hook back codeDest[0] = g_jmp_p9[0]; *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1)); return res; } void HookDevice9Methods() { DWORD g_savedProtection_p9 = 0; HMODULE hD3D9 = GetModuleHandleA("d3d9.dll"); //get the actual d3d9.dll address g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9); //calculate the actual Present() address g_jmp_p9[0] = 0xE9; //fill the codecave array ("jmp hooked_present") DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5; //calculate the hooked Present() address memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD)); //write it into the cave memcpy(g_codeFragment_p9, g_D3D9_Present, 5); //save the first 5 (jmp + addr) bytes of the original Present() VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9); //make the code writable\executable memcpy(g_D3D9_Present, g_jmp_p9, 5); //write the codecave in the beginning of the original Present() } //hooking thread main function DWORD WINAPI TF(LPVOID) { GetDevice9Methods(); //get the VMT and the offsets HookDevice9Methods(); //actually, hook the needed functions return 0; } //hotkeys thread main function DWORD WINAPI KeyboardHook(LPVOID) { while (1) { if (GetAsyncKeyState(VK_F4)) { indicator = !indicator; Beep(500, 200); } Sleep(100); } return 0; } int _stdcall DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, void* lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: //if we are attached into the game's process CreateThread(0, 0, TF, 0, 0, 0); //start D3D-hooking thread CreateThread(0, 0, KeyboardHook, 0, 0, 0); //start hotkeys thread } return 1; } вот этот участок выводит текст Спойлер if (indicator) { HDC hdc = GetDC(0); RECT rect = { 20, 20, 200, 200 }; SetTextColor(hdc, RGB(255, 0, 0)); SetBkMode(hdc, TRANSPARENT); SetBkColor(hdc, RGB(0, 255, 0, 0)); DrawText(hdc, L"Directx Hook", -1, &rect, DT_LEFT); } выглядит это вот так directx hook нужно, чтобы выводился не текст, а хотя бы картинка, лучше видео, а еще лучше, окно другого приложения. Кто может что посоветовать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения