Перейти к содержанию
Авторизация  
zorinchel

[С++] Вывод окна одной игры поверх другой

Рекомендуемые сообщения

Привет!

Может кто-нибудь подскажет как нормально вывести окно одной игры поверх другой, а то у меня получается совсем не то что нужно

Спойлер

#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);

			}


		}


	}
}

 

 

вот что получилось в итоге 

 

Изменено пользователем zorinchel

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
43 минуты назад, zorinchel сказал:

как нормально вывести окно одной игры поверх другой

Ты не выведешь другое окно поверх первого если первое находится в полноэкранном режиме без жесткого вмешательства в процесс игры. Своим кодом ты просто запускаешь новый процесс.

Простой вариант - запустить первую игру в оконном режиме, убрать рамку и масштабировать в расширение экрана и уже по верх него запускать другое окно, но опять же в виндовсе может быть активным только одно окно.

 

  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть код, который выводит текст поверх приложения

Спойлер

#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

нужно, чтобы выводился не текст, а хотя бы картинка, лучше видео, а еще лучше, окно другого приложения. Кто может что посоветовать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.