'Fixa' DirectX 9-spel med hjälp av hooking

Permalänk
Medlem

'Fixa' DirectX 9-spel med hjälp av hooking

Hej!

Ett spel som jag kör då och då tillåter inte spelarna att alt+tab ur spelet. Det är otroligt irriterande av en mängd olika anledningar som inte ens behöver räknas upp.

Det som händer när man spelar och trycker alt+tab är att man får upp en MessageBox som säger att DirectX Device gått förlorad, och därefter stänger spelet ner sig själv. Tilläggas bör att spelet är så vitt jag vet skrivet för DX9.

Om jag inte misstar mig så fångar spelutvecklarna D3DERR_DEVICELOST från IDirect3DDevice9::Present och slänger fram en MessageBox och sedan avslutar spelet. Det jag tänkte var att då hooka ::Create med hjälp av Microsoft Detours och skapa en wrapper runt nödvändiga DX-funktioner, och i ::Present helt enkelt ta hand om DEVICELOST-problemet själv.

Frågor:

  • Är jag helt ute och cyklar?

  • Hur återskapar jag alla resurser i spelet efter jag kört ::Reset?

Jag tar gärna emot matnyttig information kring DirectX som kan vara nödvändigt för det här.

Tack på förhand.

Permalänk
Medlem

Jag har ingen erfarenhet av DirectX, men jag får känslan av att du försöker dig på en onödigt komplex lösning. Personligen hade jag nog försökt mig på att ändra fönsterläget från helskärm till vanligt fönster, för sådana borde man ju kunna alt-tabba från? Antar att det är nån enkel flagga som skiljer sig vid uppstart mellan fullskärm och fönster.

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Medlem
Skrivet av Delight:

Jag har ingen erfarenhet av DirectX, men jag får känslan av att du försöker dig på en onödigt komplex lösning. Personligen hade jag nog försökt mig på att ändra fönsterläget från helskärm till vanligt fönster, för sådana borde man ju kunna alt-tabba från? Antar att det är nån enkel flagga som skiljer sig vid uppstart mellan fullskärm och fönster.

Jag satt och läste lite igår kväll och såg att det fanns en BOOL Windowed i strukturen D3DPRESENT_PARAMETERS. Jag antar att det går att hooka nödvändiga funktioner och helt enkelt ändra den variabeln. Men spelet körs nog i ett fönster då, och jag (och många andra) kör med SLI/Crossfire, vilket inte fungerar i fönsterläge vad jag förstått. Ett annat problem är att prestandan blir markant sämre i fönsterläge än fullskärmsläge.

Det absolut bästa vore att fixa så man kan köra i fullskärm och kunna tabba. Tråkigt nog verkar det vara det svåraste att implementera.

Till spelet Final Fantasy XI så finns det ett program som kallas "Windower" som gör exakt det jag vill göra. Tyvärr finns det ingen källkod (stängd) och det är inte mycket som jag kan finna om hur programmet fungerar. Det jag ser från min debugger är åtminstone att den skjuter in en dll i spelet och gör, ja, något. Något som jag vill veta...

Ja ja, får väl fortsätta spela via Steam annars. Då har jag åtminstone webbläsare som jag kan chatta genom.

Permalänk
Medlem

Efter att ha läst lite på windower-sidan verkar det faktiskt som att det programmet fungerar på det som vi pratat om - tvingar fram ett fönsterläge, och ändrar sedan målprogrammets fönsteryta så hela skärmen täcks. Antagligen läggs en top_most-flagga på också så att inte andra program kan täcka spelet.

Antar att det är det bästa sättet att göra det på. Du kan ju prova att hooka anropet du nämnde och sätta den där boolen till true och se hur prestandan blir. Bra övning i detour om inte annat

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."