Перейти к содержанию

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


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

Привет!

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

Спойлер

#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
Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

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

Спойлер

#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

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

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

×
×
  • Создать...

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

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