mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
v2_03_41_src
Former-commit-id: 75e42f81096bdea104b7b82ac70a502963c0fe39
This commit is contained in:
parent
7ff3fc295d
commit
b3937c0e3f
@ -138,7 +138,7 @@
|
||||
#define SUPPORTSVGA 0x00400000 // Supports SVGA standard resolutions
|
||||
#define SUPPORTHDTV 0x00800000 // Supports HDTV standard resolutions
|
||||
#define RELEASEMOUSE 0x01000000 // GetCursorPos returns centered coordinates when the mouse cursor is moved outside the window
|
||||
#define FRAMECOMPENSATION 0x02000000 // Compensate for frame border adding x,y displacement of (x) left border and (y) window title bar
|
||||
//#define FRAMECOMPENSATION 0x02000000 // Compensate for frame border adding x,y displacement of (x) left border and (y) window title bar
|
||||
#define HOTPATCH 0x04000000 // Use hot patching technique to handle obfuscated IAT
|
||||
#define ENABLEHOTKEYS 0x08000000 // Enables hot keys
|
||||
#define HOTPATCHALWAYS 0x10000000 // Force hot patching to every call
|
||||
@ -206,6 +206,8 @@
|
||||
#define FIXPIXELZOOM 0x00400000
|
||||
#define REUSEEMULATEDDC 0x00800000
|
||||
#define CREATEDESKTOP 0x01000000 // creates a virtual desktop window to replace the real one
|
||||
#define NOWINDOWHOOKS 0x02000000 // do not intercept window callback routines
|
||||
//#define NOMOUSEPROC 0x04000000 // don't process mouse x,y coordinates twice in WindowProc and MessageHook hookers
|
||||
|
||||
// logging Tflags DWORD:
|
||||
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:42ec28df67eae0d8fd18218010fd1cf3ad9c182d0b3ee9d828c1d11c925c96e0
|
||||
oid sha256:d724989d76de31cdefc98848587998e2e3464ea49793397892e068d37db2c730
|
||||
size 593408
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:945f3a67534c63ae2e17d0cb76db3a473149e39b62164fb433f6a4a021d75471
|
||||
oid sha256:17c20de2bcab09a41568811d8227ff38f2411dd95c133e1252e2852293ab643f
|
||||
size 545280
|
||||
|
Binary file not shown.
32
build/exports/688(I) Hunter Killer.dxw
Normal file
32
build/exports/688(I) Hunter Killer.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=688(I) Hunter Killer
|
||||
path0=D:\Games\688\688I_HK.EXE
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=-2011168734
|
||||
flagg0=1209008128
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=4224
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
32
build/exports/Batman Vengeance.dxw
Normal file
32
build/exports/Batman Vengeance.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=Batman Vengeance
|
||||
path0=D:\Games\Batman Vengeance\Batman\Batman.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136314914
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=4224
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
32
build/exports/Cool Pool Eightball Demo.dxw
Normal file
32
build/exports/Cool Pool Eightball Demo.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=Cool Pool Eightball Demo
|
||||
path0=D:\Games\CoolPoolEightballDemo\CoolPool.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136314914
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=134217732
|
||||
flagj0=4224
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
32
build/exports/Deathtrap Dungeon.dxw
Normal file
32
build/exports/Deathtrap Dungeon.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=Deathtrap Dungeon
|
||||
path0=F:\ASYLUM\DD_CD.EXE
|
||||
launchpath0=D:\Games\Deathtrap Dungeon\DDSTART.EXE
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=Note:\ninstalled from CD, the game need to be configured with the launcher from the HD \nand the actual game exe from the CD!\n\nNote: \nThe intro movies are interlaced and can be deinterlaced. \nAlso, the game can be rendered with bilinear filtering.
|
||||
registry0=
|
||||
ver0=1
|
||||
coord0=0
|
||||
flag0=681574434
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=268439680
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
32
build/exports/Dweep Gold.dxw
Normal file
32
build/exports/Dweep Gold.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=Dweep Gold
|
||||
path0=D:\Games\DweepGol\Dweep.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136314914
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=134217732
|
||||
flagj0=4224
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
32
build/exports/Fin-Fin.dxw
Normal file
32
build/exports/Fin-Fin.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=Fin-Fin
|
||||
path0=D:\Games\Fin-Fin\v90seger\teoboot.exe
|
||||
launchpath0=D:\Games\Fin-Fin\v90seger\FinFin.exe
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=-1465909214
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=205520900
|
||||
flagj0=4224
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
@ -5,14 +5,14 @@ launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
ver0=0
|
||||
ver0=7
|
||||
coord0=0
|
||||
flag0=-1476394974
|
||||
flag0=-1474297822
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagh0=33554448
|
||||
flagi0=205520900
|
||||
flagj0=4224
|
||||
flagk0=512
|
||||
flagk0=66048
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -29,3 +29,4 @@ initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
||||
registry0=
|
||||
|
32
build/exports/PBA Bowling 2 Demo.dxw
Normal file
32
build/exports/PBA Bowling 2 Demo.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=PBA Bowling 2 Demo
|
||||
path0=D:\Games\PBA Bowling 2 Demo\BowlingR.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136314914
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=4224
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
@ -1,6 +1,6 @@
|
||||
[target]
|
||||
title0=Requiem Avenging Angel (D3D)
|
||||
path0=D:\Games\Requiem Avenging Angel\D3D.exe
|
||||
path0=D:\Games\Requiem Avenging Angel\D3D.by Matt.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
@ -8,8 +8,8 @@ ver0=0
|
||||
coord0=0
|
||||
flag0=-1468006366
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagh0=1044
|
||||
flagi0=1212153860
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -26,3 +26,7 @@ initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
flagj0=128
|
||||
notes0=
|
||||
registry0=# Requiem Avenging Angel: DirectX version patch\n\n[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\DirectX]\n"Version"="4.07.00.0704"\n\n[HKEY_LOCAL_MACHINE\Software\Microsoft\DirectX]\n"Version"="4.07.00.0704"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DirectX]\n"Version"="4.07.00.0704"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectX]\n"Version"="4.07.00.0704"\n
|
||||
flagk0=67174400
|
||||
swapeffect0=0
|
||||
|
@ -8,9 +8,9 @@ ver0=0
|
||||
coord0=0
|
||||
flag0=-1199570906
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagh0=1044
|
||||
flagi0=1212153860
|
||||
tflag0=6914
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
@ -25,3 +25,8 @@ maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
notes0=
|
||||
registry0=# Requiem Avenging Angel: DirectX version patch\n\n[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\DirectX]\n"Version"="4.07.00.0704"\n\n[HKEY_LOCAL_MACHINE\Software\Microsoft\DirectX]\n"Version"="4.07.00.0704"\n
|
||||
flagj0=128
|
||||
flagk0=67174400
|
||||
swapeffect0=0
|
||||
|
32
build/exports/Sid Meyer's Gettysburg Demo.dxw
Normal file
32
build/exports/Sid Meyer's Gettysburg Demo.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=Sid Meyer's Gettysburg Demo
|
||||
path0=D:\Games\Sid Meyer's Gettysburg Demo\lee.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=673185826
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=67113088
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
@ -5,10 +5,10 @@ module0=
|
||||
opengllib0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=-2147483102
|
||||
flagg0=269484064
|
||||
flag0=-2147483614
|
||||
flagg0=1477443616
|
||||
flagh0=532
|
||||
flagi0=0
|
||||
flagi0=4194304
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -22,3 +22,11 @@ sizx0=0
|
||||
sizy0=0
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
launchpath0=
|
||||
notes0=
|
||||
registry0=
|
||||
flagj0=67108992
|
||||
flagk0=65536
|
||||
winver0=0
|
||||
maxres0=0
|
||||
swapeffect0=0
|
||||
|
32
build/exports/X-Files, the.dxw
Normal file
32
build/exports/X-Files, the.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=X-Files, the
|
||||
path0=D:\Games\X-Files\XFiles.exe
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=-2011168733
|
||||
flagg0=1209008128
|
||||
flagh0=16
|
||||
flagi0=138412036
|
||||
flagj0=67113088
|
||||
flagk0=327680
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
@ -928,4 +928,14 @@ add: preliminary implementation of virtual desktop window. Useless so far.
|
||||
fix: hooked more GDI calls: CreateICA, GetViewportExtEx, IntersectClipRect, SetRectRgn
|
||||
fix: ChangeDisplaySettings no longer take note of video mode when called with CDS_TEST flag
|
||||
fix: merged user32 FillRect and FrameRect handling
|
||||
fix: fixed bug that was leaving a copy of dxwnd.ini on last visited directory on window close
|
||||
fix: fixed bug that was leaving a copy of dxwnd.ini on last visited directory on window close
|
||||
|
||||
v2.03.41
|
||||
fix: filtering of mouse messages in "Message pump" option. Makes games more responsive to mouse clicks. Improves "X-files".
|
||||
fix: exclusion of DDSCL_SETDEVICEWINDOW, DDSCL_CREATEDEVICEWINDOW and DDSCL_SETFOCUSWINDOW flags in ddraw SetCooperativeLevel windowed mode
|
||||
fix: guess PRIMARY surface in ddraw1 when no flags (but BACKBUFFERCOUNT) are set. Necessary for "Star Force Deluxe"
|
||||
delete: suppressed frame compensation option FRAMECOMPENSATION (unused).
|
||||
add: added debug flag NOWINDOWHOOKS to avoid WindowProc hook.
|
||||
fix: GetPaletteEntries hook returns 256 value against hpal=NULL. Let "M.I.B." run, though palette is still not ok.
|
||||
fix: StretchDIBits hook no longer can return an unassigned value
|
||||
fix: anti-recursion check in DialogBox WindowProc call
|
||||
|
@ -336,6 +336,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect,
|
||||
while(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
|
||||
OutTraceW("MESSAGEPUMP: msg=%x l-wParam=(%x,%x)\n", msg.message, msg.lParam, msg.wParam);
|
||||
if((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST)) break; // do not consume keyboard inputs
|
||||
if((msg.message >= WM_MOUSEFIRST) && (msg.message <= WM_MOUSELAST)) break; // do not consume mouse inputs
|
||||
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
|
@ -2088,7 +2088,8 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags)
|
||||
dxw.SethWnd(hwnd);
|
||||
}
|
||||
dxw.SetFullScreen(TRUE);
|
||||
dwflags &= ~(DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWMODEX);
|
||||
// v2.03.41: added suppression of DDSCL_SETDEVICEWINDOW DDSCL_CREATEDEVICEWINDOW DDSCL_SETFOCUSWINDOW used by "PBA Bowling 2"
|
||||
dwflags &= ~(DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWMODEX | DDSCL_SETDEVICEWINDOW | DDSCL_CREATEDEVICEWINDOW | DDSCL_SETFOCUSWINDOW);
|
||||
dwflags |= DDSCL_NORMAL;
|
||||
bFixFrame = TRUE;
|
||||
}
|
||||
@ -2844,15 +2845,15 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate
|
||||
//GHO workaround (needed for WarWind, Rogue Spear):
|
||||
if (lpddsd->dwFlags && !(lpddsd->dwFlags & 0x1)){
|
||||
OutTraceDW("CreateSurface: fixing illegal dwFlags value: %x -> %x\n",
|
||||
lpddsd->dwFlags, lpddsd->dwFlags+1);
|
||||
lpddsd->dwFlags++;
|
||||
lpddsd->dwFlags, (lpddsd->dwFlags | DDSD_CAPS));
|
||||
lpddsd->dwFlags |= DDSD_CAPS;
|
||||
}
|
||||
|
||||
memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy
|
||||
|
||||
// v2.02.38: this is odd: in "Star Force Deluxe" there is no PRIMARY surface, but a surface with
|
||||
// 0 flags and 0 capabilities serves for this purpose. Is it a side-effect of old ddraw releases?
|
||||
if((dxversion == 1) && (ddsd.dwFlags == 0)){ // Star Force Deluxe
|
||||
if((dxversion == 1) && ((ddsd.dwFlags & ~DDSD_BACKBUFFERCOUNT) == 0)){ // Star Force Deluxe
|
||||
ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
|
||||
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
||||
//if(dxw.VirtualPixelFormat.dwRGBBitCount == 8) ddsd.ddsCaps.dwCaps |= DDSCAPS_PALETTE;
|
||||
|
622
dll/dxhook.cpp
622
dll/dxhook.cpp
@ -28,6 +28,8 @@ dxwCore dxw;
|
||||
dxwSStack dxwss;
|
||||
dxwWStack dxwws;
|
||||
|
||||
extern LRESULT CALLBACK MessageHook(int, WPARAM, LPARAM);
|
||||
|
||||
typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long);
|
||||
typedef int (*Preparedisasm_Type)(void);
|
||||
typedef void (*Finishdisasm_Type)(void);
|
||||
@ -42,7 +44,7 @@ extern void InitScreenParameters();
|
||||
extern void *HotPatch(void *, const char *, void *);
|
||||
extern void *IATPatch(HMODULE, char *, void *, const char *, void *);
|
||||
void HookModule(HMODULE, int);
|
||||
static void RecoverScreenMode();
|
||||
void RecoverScreenMode();
|
||||
static void LockScreenMode(DWORD, DWORD, DWORD);
|
||||
|
||||
extern HANDLE hTraceMutex;
|
||||
@ -89,7 +91,7 @@ static char *Flag4Names[32]={
|
||||
"LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP",
|
||||
"STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF",
|
||||
"FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV",
|
||||
"RELEASEMOUSE", "FRAMECOMPENSATION", "HOTPATCH", "ENABLEHOTKEYS",
|
||||
"RELEASEMOUSE", "--FRAMECOMPENSATION--", "HOTPATCH", "ENABLEHOTKEYS",
|
||||
"HOTPATCHALWAYS", "NOD3DRESET", "OVERRIDEREGISTRY", "HIDECDROMEMPTY",
|
||||
};
|
||||
|
||||
@ -111,7 +113,7 @@ static char *Flag6Names[32]={
|
||||
"NOSYSMEMPRIMARY", "NOSYSMEMBACKBUF", "CONFIRMONCLOSE", "TERMINATEONCLOSE",
|
||||
"FLIPEMULATION", "SETZBUFFERBITDEPTHS", "SHAREDDC", "WOW32REGISTRY",
|
||||
"STRETCHMOVIES", "BYPASSMCI", "FIXPIXELZOOM", "REUSEEMULATEDDC",
|
||||
"", "", "", "",
|
||||
"CREATEDESKTOP", "NOWINDOWHOOKS", "--NOMOUSEPROC--", "",
|
||||
"", "", "", "",
|
||||
};
|
||||
|
||||
@ -265,21 +267,7 @@ void OutTraceHex(BYTE *bBuf, int iLen)
|
||||
OutTrace("\n");
|
||||
}
|
||||
|
||||
static void dx_ToggleLogging()
|
||||
{
|
||||
// toggle LOGGING
|
||||
if(dxw.dwTFlags & OUTTRACE){
|
||||
OutTraceDW("Toggle logging OFF\n");
|
||||
dxw.dwTFlags &= ~OUTTRACE;
|
||||
}
|
||||
else {
|
||||
dxw.dwTFlags |= OUTTRACE;
|
||||
OutTraceDW("Toggle logging ON\n");
|
||||
}
|
||||
GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE);
|
||||
}
|
||||
|
||||
static void SuppressIMEWindow()
|
||||
void SuppressIMEWindow()
|
||||
{
|
||||
OutTraceDW("WindowProc: SUPPRESS IME\n");
|
||||
typedef BOOL (WINAPI *ImmDisableIME_Type)(DWORD);
|
||||
@ -595,6 +583,9 @@ void AdjustWindowPos(HWND hwnd, DWORD width, DWORD height)
|
||||
void HookWindowProc(HWND hwnd)
|
||||
{
|
||||
WNDPROC pWindowProc;
|
||||
|
||||
if(dxw.dwFlags6 & NOWINDOWHOOKS) return;
|
||||
|
||||
pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC);
|
||||
// don't hook twice ....
|
||||
if ((pWindowProc == extWindowProc) ||
|
||||
@ -660,549 +651,6 @@ void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height)
|
||||
(*pInvalidateRect)(hwnd, NULL, TRUE);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK extDialogWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
static int i=0;
|
||||
static WINDOWPOS *wp;
|
||||
WNDPROC pWindowProc;
|
||||
|
||||
static int t = -1;
|
||||
if (t == -1)
|
||||
t = (*pGetTickCount)();
|
||||
int tn = (*pGetTickCount)();
|
||||
|
||||
OutTraceW("DEBUG: DialogWinMsg hwnd=%x msg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
|
||||
// optimization: don't invalidate too often!
|
||||
// 200mSec seems a good compromise.
|
||||
if (tn-t > 200) {
|
||||
(*pInvalidateRect)(hwnd, NULL, TRUE);
|
||||
t=tn;
|
||||
}
|
||||
|
||||
pWindowProc=dxwws.GetProc(hwnd);
|
||||
if(pWindowProc) return(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam);
|
||||
char *sMsg="ASSERT: DialogWinMsg pWindowProc=NULL !!!\n";
|
||||
OutTraceDW(sMsg);
|
||||
if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK extChildWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
static int i=0;
|
||||
static WINDOWPOS *wp;
|
||||
WNDPROC pWindowProc;
|
||||
|
||||
OutTraceW("DEBUG: ChildWinMsg hwnd=%x msg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
|
||||
if(dxw.Windowize){
|
||||
switch(message){
|
||||
// Cybermercs: it seems that all game menus are conveniently handled by the WindowProc routine,
|
||||
// while the action screen get messages processed by the ChildWindowProc, that needs some different
|
||||
// setting ..........
|
||||
// Beware: Cybermercs handles some static info about cursor position handling, so that if you resize
|
||||
// a menu it doesn't work correctly until you don't change screen.
|
||||
case WM_MOUSEMOVE:
|
||||
case WM_MOUSEWHEEL:
|
||||
case WM_LBUTTONDOWN:
|
||||
case WM_LBUTTONUP:
|
||||
case WM_LBUTTONDBLCLK:
|
||||
case WM_RBUTTONDOWN:
|
||||
case WM_RBUTTONUP:
|
||||
case WM_RBUTTONDBLCLK:
|
||||
case WM_MBUTTONDOWN:
|
||||
case WM_MBUTTONUP:
|
||||
case WM_MBUTTONDBLCLK:
|
||||
if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
|
||||
POINT prev, curr;
|
||||
// scale mouse coordinates
|
||||
prev.x = LOWORD(lparam);
|
||||
prev.y = HIWORD(lparam);
|
||||
curr = prev;
|
||||
if(message == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix
|
||||
POINT upleft={0,0};
|
||||
(*pClientToScreen)(dxw.GethWnd(), &upleft);
|
||||
curr = dxw.SubCoordinates(curr, upleft);
|
||||
}
|
||||
//OutTraceC("ChildWindowProc: hwnd=%x pos XY prev=(%d,%d)\n", hwnd, prev.x, prev.y);
|
||||
curr=dxw.FixCursorPos(curr); // Warn! the correction must refer to the main window hWnd, not the current hwnd one !!!
|
||||
lparam = MAKELPARAM(curr.x, curr.y);
|
||||
OutTraceC("ChildWindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pWindowProc=dxwws.GetProc(hwnd);
|
||||
|
||||
// v2.02.82: use CallWindowProc that handles WinProc handles
|
||||
if(pWindowProc) return(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam);
|
||||
// should never get here ....
|
||||
OutTraceDW("ChildWindowProc: no WndProc for CHILD hwnd=%x\n", hwnd);
|
||||
return DefWindowProc(hwnd, message, wparam, lparam);
|
||||
}
|
||||
|
||||
static void dx_UpdatePositionLock(HWND hwnd)
|
||||
{
|
||||
RECT rect;
|
||||
POINT p={0,0};
|
||||
(*pGetClientRect)(hwnd,&rect);
|
||||
(*pClientToScreen)(hwnd,&p);
|
||||
dxw.dwFlags1 |= LOCKWINPOS;
|
||||
OutTraceDW("Toggle position lock ON\n");
|
||||
dxw.InitWindowPos(p.x, p.y, rect.right-rect.left, rect.bottom-rect.top);
|
||||
}
|
||||
|
||||
static void dx_TogglePositionLock(HWND hwnd)
|
||||
{
|
||||
// toggle position locking
|
||||
if(dxw.dwFlags1 & LOCKWINPOS){
|
||||
// unlock
|
||||
OutTraceDW("Toggle position lock OFF\n");
|
||||
dxw.dwFlags1 &= ~LOCKWINPOS;
|
||||
}
|
||||
else {
|
||||
OutTraceDW("Toggle position lock ON\n");
|
||||
dxw.dwFlags1 |= LOCKWINPOS;
|
||||
dx_UpdatePositionLock(hwnd);
|
||||
}
|
||||
}
|
||||
|
||||
static void dx_ToggleFPS()
|
||||
{
|
||||
if(dxw.dwFlags2 & SHOWFPS){
|
||||
dxw.dwFlags2 &= ~SHOWFPS;
|
||||
OutTrace("ToggleFPS: SHOWFPS mode OFF\n");
|
||||
}
|
||||
else {
|
||||
dxw.dwFlags2 |= SHOWFPS;
|
||||
OutTrace("ToggleFPS: SHOWFPS mode ON\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void dx_Cornerize(HWND hwnd)
|
||||
{
|
||||
static RECT WinRect = {0, 0, 0, 0};
|
||||
static DWORD OldStyle, OldExtStyle;
|
||||
// toggle ....
|
||||
if (WinRect.right == 0){
|
||||
OutTraceDW("DxWnd: entering corner mode\n");
|
||||
(*pGetWindowRect)(hwnd, &WinRect);
|
||||
OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE);
|
||||
OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
|
||||
(*pSetWindowLongA)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED);
|
||||
(*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0);
|
||||
(*pMoveWindow)(hwnd, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), TRUE);
|
||||
}
|
||||
else {
|
||||
OutTraceDW("DxWnd: exiting corner mode\n");
|
||||
(*pSetWindowLongA)(hwnd, GWL_STYLE, OldStyle);
|
||||
(*pSetWindowLongA)(hwnd, GWL_EXSTYLE, OldExtStyle);
|
||||
(*pMoveWindow)(hwnd, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom, TRUE);
|
||||
memset(&WinRect, 0, sizeof(WinRect));
|
||||
}
|
||||
dxw.ScreenRefresh();
|
||||
}
|
||||
|
||||
LRESULT LastCursorPos;
|
||||
|
||||
LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
POINT prev, curr;
|
||||
RECT rect;
|
||||
static int i=0;
|
||||
static int ClipCursorToggleState = 1;
|
||||
WNDPROC pWindowProc;
|
||||
extern void dxwFixWindowPos(char *, HWND, LPARAM);
|
||||
extern LPRECT lpClipRegion;
|
||||
static BOOL DoOnce = TRUE;
|
||||
static BOOL IsToBeLocked;
|
||||
static int LastTimeShift;
|
||||
static int SaveTimeShift;
|
||||
static BOOL TimeShiftToggle=TRUE;
|
||||
extern void DDrawScreenShot();
|
||||
|
||||
if(DoOnce){
|
||||
DoOnce=FALSE;
|
||||
IsToBeLocked=(dxw.dwFlags1 & LOCKWINPOS);
|
||||
LastTimeShift=SaveTimeShift=dxw.TimeShift;
|
||||
}
|
||||
|
||||
// v2.1.93: adjust clipping region
|
||||
|
||||
if(IsTraceW){
|
||||
char sPos[161];
|
||||
sPos[160]=0;
|
||||
sPos[0]=0;
|
||||
switch(message){
|
||||
case WM_WINDOWPOSCHANGING:
|
||||
case WM_WINDOWPOSCHANGED:
|
||||
LPWINDOWPOS wp;
|
||||
wp = (LPWINDOWPOS)lparam;
|
||||
sprintf_s(sPos, 160, " pos=(%d,%d) size=(%dx%d) flags=%x(%s)", wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags));
|
||||
break;
|
||||
case WM_MOVE:
|
||||
sprintf_s(sPos, 160, " pos=(%d,%d)", HIWORD(lparam), LOWORD(lparam));
|
||||
break;
|
||||
case WM_SIZE:
|
||||
static char *modes[5]={"RESTORED", "MINIMIZED", "MAXIMIZED", "MAXSHOW", "MAXHIDE"};
|
||||
sprintf_s(sPos, 160, " mode=SIZE_%s size=(%dx%d)", modes[wparam % 5], HIWORD(lparam), LOWORD(lparam));
|
||||
break;
|
||||
}
|
||||
OutTrace("WindowProc[%x]: WinMsg=[0x%x]%s(%x,%x) %s\n", hwnd, message, ExplainWinMessage(message), wparam, lparam, sPos);
|
||||
}
|
||||
|
||||
if(dxw.dwFlags3 & FILTERMESSAGES){
|
||||
switch(message){
|
||||
case WM_NCMOUSEMOVE:
|
||||
case WM_NCLBUTTONDOWN:
|
||||
case WM_NCLBUTTONUP:
|
||||
case WM_NCLBUTTONDBLCLK:
|
||||
case WM_NCRBUTTONDOWN:
|
||||
case WM_NCRBUTTONUP:
|
||||
case WM_NCRBUTTONDBLCLK:
|
||||
case WM_NCMBUTTONDOWN:
|
||||
case WM_NCMBUTTONUP:
|
||||
case WM_NCMBUTTONDBLCLK:
|
||||
OutTraceDW("WindowProc[%x]: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(LastTimeShift != dxw.TimeShift){
|
||||
extern void SetVSyncDelays(LPDIRECTDRAW);
|
||||
extern LPDIRECTDRAW lpPrimaryDD;
|
||||
if(dxw.dwFlags4 & STRETCHTIMERS) dxw.RenewTimers();
|
||||
if(lpPrimaryDD) SetVSyncDelays(lpPrimaryDD);
|
||||
LastTimeShift=dxw.TimeShift;
|
||||
}
|
||||
|
||||
switch(message){
|
||||
// v2.02.13: added WM_GETMINMAXINFO/WM_NCCALCSIZE interception - (see Actua Soccer 3 problems...)
|
||||
//case WM_NCDESTROY:
|
||||
// return 0;
|
||||
case WM_GETMINMAXINFO:
|
||||
if(dxw.dwFlags1 & LOCKWINPOS){
|
||||
extern void dxwFixMinMaxInfo(char *, HWND, LPARAM);
|
||||
dxwFixMinMaxInfo("WindowProc", hwnd, lparam);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case WM_NCCALCSIZE:
|
||||
case WM_NCPAINT:
|
||||
if((dxw.dwFlags1 & LOCKWINPOS) && (hwnd == dxw.GethWnd()) && dxw.IsFullScreen()){ // v2.02.30: don't alter child and other windows....
|
||||
OutTraceDW("WindowProc: %s wparam=%x\n", ExplainWinMessage(message), wparam);
|
||||
return (*pDefWindowProcA)(hwnd, message, wparam, lparam);
|
||||
}
|
||||
break;
|
||||
case WM_NCCREATE:
|
||||
if(dxw.dwFlags2 & SUPPRESSIME) SuppressIMEWindow();
|
||||
break;
|
||||
case WM_IME_SETCONTEXT:
|
||||
case WM_IME_NOTIFY:
|
||||
case WM_IME_CONTROL:
|
||||
case WM_IME_COMPOSITIONFULL:
|
||||
case WM_IME_SELECT:
|
||||
case WM_IME_CHAR:
|
||||
case WM_IME_REQUEST:
|
||||
case WM_IME_KEYDOWN:
|
||||
case WM_IME_KEYUP:
|
||||
if(dxw.dwFlags2 & SUPPRESSIME){
|
||||
OutTraceDW("WindowProc[%x]: SUPPRESS IME WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case WM_NCHITTEST:
|
||||
if((dxw.dwFlags2 & FIXNCHITTEST) && (dxw.dwFlags1 & MODIFYMOUSE)){ // mouse processing
|
||||
POINT cursor;
|
||||
LRESULT ret;
|
||||
ret=(*pDefWindowProcA)(hwnd, message, wparam, lparam);
|
||||
if (ret==HTCLIENT) {
|
||||
cursor.x=LOWORD(lparam);
|
||||
cursor.y=HIWORD(lparam);
|
||||
dxw.FixNCHITCursorPos(&cursor);
|
||||
lparam = MAKELPARAM(cursor.x, cursor.y);
|
||||
}
|
||||
else
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
case WM_ERASEBKGND:
|
||||
if(dxw.Windowize && dxw.IsDesktop(hwnd)){
|
||||
OutTraceDW("WindowProc: WM_ERASEBKGND(%x,%x) - suppressed\n", wparam, lparam);
|
||||
return 1; // 1 == OK, erased
|
||||
}
|
||||
break;
|
||||
case WM_DISPLAYCHANGE:
|
||||
if (dxw.Windowize && (dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()){
|
||||
OutTraceDW("WindowProc: prevent WM_DISPLAYCHANGE depth=%d size=(%d,%d)\n",
|
||||
wparam, LOWORD(lparam), HIWORD(lparam));
|
||||
// v2.02.43: unless EMULATESURFACE is set, lock the screen resolution only, but not the color depth!
|
||||
if(dxw.dwFlags1 & EMULATESURFACE) return 0;
|
||||
// let rparam (color depth) change, but override lparam (screen width & height.)
|
||||
lparam = MAKELPARAM((LONG)dxw.GetScreenWidth(), (LONG)dxw.GetScreenHeight());
|
||||
//return 0;
|
||||
}
|
||||
break;
|
||||
case WM_WINDOWPOSCHANGING:
|
||||
case WM_WINDOWPOSCHANGED:
|
||||
if(dxw.Windowize && dxw.IsFullScreen()){
|
||||
if(dxw.dwFlags5 & NOWINPOSCHANGES){
|
||||
OutTraceDW("WindowProc: %s - suppressed\n", message==WM_WINDOWPOSCHANGED ? "WM_WINDOWPOSCHANGED" : "WM_WINDOWPOSCHANGING");
|
||||
return 0;
|
||||
}
|
||||
extern HWND hControlParentWnd;
|
||||
LPWINDOWPOS wp;
|
||||
wp = (LPWINDOWPOS)lparam;
|
||||
dxwFixWindowPos("WindowProc", hwnd, lparam);
|
||||
OutTraceDW("WindowProc: %s fixed size=(%d,%d)\n",
|
||||
(message == WM_WINDOWPOSCHANGED) ? "WM_WINDOWPOSCHANGED" : "WM_WINDOWPOSCHANGING", wp->cx, wp->cy);
|
||||
// try to lock main wind & control parent together
|
||||
if((message==WM_WINDOWPOSCHANGED) && hControlParentWnd){
|
||||
if(dxw.IsDesktop(hwnd)) {
|
||||
POINT fo = dxw.GetFrameOffset();
|
||||
(*pMoveWindow)(hControlParentWnd, wp->x+fo.x, wp->y+fo.y, wp->cx, wp->cy, TRUE);
|
||||
}
|
||||
}
|
||||
// v2.03.30: in window mode, it seems that the WM_ACTIVATEAPP message is not sent to the main win.
|
||||
// this PostMessage call recovers "Thorgal" block at the end of intro movie and "Championship Manager 03 04" cursor
|
||||
if((message==WM_WINDOWPOSCHANGED) && (dxw.dwFlags6 & ACTIVATEAPP)){
|
||||
PostMessage(hwnd, WM_ACTIVATEAPP, 1, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WM_ENTERSIZEMOVE:
|
||||
if(IsToBeLocked){
|
||||
dxw.dwFlags1 &= ~LOCKWINPOS;
|
||||
}
|
||||
while((*pShowCursor)(1) < 0);
|
||||
if(dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor();
|
||||
if(dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL);
|
||||
break;
|
||||
case WM_EXITSIZEMOVE:
|
||||
if(IsToBeLocked){
|
||||
dxw.dwFlags1 |= LOCKWINPOS;
|
||||
dx_UpdatePositionLock(hwnd);
|
||||
}
|
||||
if((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()) while((*pShowCursor)(0) >= 0);
|
||||
if(dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0);
|
||||
if(dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion);
|
||||
if(dxw.dwFlags2 & REFRESHONRESIZE) dxw.ScreenRefresh();
|
||||
if(dxw.dwFlags4 & HIDEDESKTOP) dxw.HideDesktop(dxw.GethWnd());
|
||||
if(dxw.dwFlags5 & CENTERTOWIN) {
|
||||
HDC thdc;
|
||||
HWND w = dxw.GethWnd();
|
||||
RECT client;
|
||||
(*pGetClientRect)(w, &client);
|
||||
thdc=(*pGDIGetDC)(w);
|
||||
if(thdc) (*pGDIBitBlt)(thdc, client.left, client.top, client.right, client.bottom, 0, 0, 0, BLACKNESS);
|
||||
}
|
||||
break;
|
||||
case WM_ACTIVATE:
|
||||
// turn DirectInput bActive flag on & off .....
|
||||
dxw.bActive = (LOWORD(wparam) == WA_ACTIVE || LOWORD(wparam) == WA_CLICKACTIVE) ? 1 : 0;
|
||||
case WM_NCACTIVATE:
|
||||
// turn DirectInput bActive flag on & off .....
|
||||
if(message == WM_NCACTIVATE) dxw.bActive = wparam;
|
||||
if(dxw.bActive) (*pSetWindowPos)(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||
if(dxw.dwFlags1 & UNNOTIFY){
|
||||
DefWindowProc(hwnd, message, wparam, lparam);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case WM_NCMOUSEMOVE:
|
||||
// Posted to a window when the cursor is moved within the nonclient area of the window.
|
||||
// This message is posted to the window that contains the cursor.
|
||||
// If a window has captured the mouse, this message is not posted.
|
||||
// V2.1.90: on nonclient areas the cursor is always shown.
|
||||
while((*pShowCursor)(1) < 0);
|
||||
break;
|
||||
case WM_MOUSEMOVE:
|
||||
if(dxw.Windowize){
|
||||
prev.x = LOWORD(lparam);
|
||||
prev.y = HIWORD(lparam);
|
||||
if ((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()){
|
||||
(*pGetClientRect)(hwnd, &rect);
|
||||
if(prev.x >= 0 && prev.x < rect.right && prev.y >= 0 && prev.y < rect.bottom)
|
||||
while((*pShowCursor)(0) >= 0);
|
||||
else
|
||||
while((*pShowCursor)(1) < 0);
|
||||
}
|
||||
else {
|
||||
while((*pShowCursor)(1) < 0);
|
||||
}
|
||||
if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
|
||||
// scale mouse coordinates
|
||||
curr=dxw.FixCursorPos(prev); //v2.02.30
|
||||
lparam = MAKELPARAM(curr.x, curr.y);
|
||||
OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
|
||||
}
|
||||
GetHookInfo()->CursorX=LOWORD(lparam);
|
||||
GetHookInfo()->CursorY=HIWORD(lparam);
|
||||
}
|
||||
break;
|
||||
// fall through cases:
|
||||
case WM_MOUSEWHEEL:
|
||||
case WM_LBUTTONDOWN:
|
||||
case WM_LBUTTONUP:
|
||||
case WM_LBUTTONDBLCLK:
|
||||
case WM_RBUTTONDOWN:
|
||||
case WM_RBUTTONUP:
|
||||
case WM_RBUTTONDBLCLK:
|
||||
case WM_MBUTTONDOWN:
|
||||
case WM_MBUTTONUP:
|
||||
case WM_MBUTTONDBLCLK:
|
||||
if(dxw.Windowize){
|
||||
if((dxw.dwFlags1 & CLIPCURSOR) && ClipCursorToggleState) dxw.SetClipCursor();
|
||||
if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
|
||||
// scale mouse coordinates
|
||||
prev.x = LOWORD(lparam);
|
||||
prev.y = HIWORD(lparam);
|
||||
curr = prev;
|
||||
if(message == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix
|
||||
POINT upleft={0,0};
|
||||
(*pClientToScreen)(dxw.GethWnd(), &upleft);
|
||||
curr = dxw.SubCoordinates(curr, upleft);
|
||||
}
|
||||
curr=dxw.FixCursorPos(curr); //v2.02.30
|
||||
lparam = MAKELPARAM(curr.x, curr.y);
|
||||
OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
|
||||
}
|
||||
GetHookInfo()->CursorX=LOWORD(lparam);
|
||||
GetHookInfo()->CursorY=HIWORD(lparam);
|
||||
}
|
||||
break;
|
||||
case WM_SETFOCUS:
|
||||
OutTraceDW("WindowProc: hwnd=%x GOT FOCUS\n", hwnd);
|
||||
if (dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion);
|
||||
break;
|
||||
case WM_KILLFOCUS:
|
||||
OutTraceDW("WindowProc: hwnd=%x LOST FOCUS\n", hwnd);
|
||||
if (dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor();
|
||||
if (dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL);
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
// Beware: closing main window does not always mean that the program is about to terminate!!!
|
||||
extern void gShowHideTaskBar(BOOL);
|
||||
if(dxw.dwFlags6 & CONFIRMONCLOSE){
|
||||
OutTraceDW("WindowProc: WM_CLOSE - terminating process?\n");
|
||||
if (MessageBoxA(NULL, "Do you really want to exit the game?", "DxWnd", MB_YESNO | MB_TASKMODAL) != IDYES) return FALSE;
|
||||
}
|
||||
if(dxw.dwFlags6 & HIDETASKBAR) gShowHideTaskBar(FALSE);
|
||||
if(dxw.dwFlags3 & FORCE16BPP) RecoverScreenMode();
|
||||
if(dxw.dwFlags6 & TERMINATEONCLOSE) TerminateProcess(GetCurrentProcess(),0);
|
||||
break;
|
||||
case WM_SYSKEYDOWN:
|
||||
case WM_KEYDOWN:
|
||||
if(!(dxw.dwFlags4 & ENABLEHOTKEYS)) break;
|
||||
OutTraceW("event %s wparam=%x lparam=%x\n", (message==WM_SYSKEYDOWN)?"WM_SYSKEYDOWN":"WM_KEYDOWN", wparam, lparam);
|
||||
UINT DxWndKey;
|
||||
DxWndKey=dxw.MapKeysConfig(message, lparam, wparam);
|
||||
switch (DxWndKey){
|
||||
case DXVK_CLIPTOGGLE:
|
||||
if(dxw.dwFlags1 & CLIPCURSOR){
|
||||
OutTraceDW("WindowProc: WM_SYSKEYDOWN key=%x ToggleState=%x\n",wparam,ClipCursorToggleState);
|
||||
ClipCursorToggleState = !ClipCursorToggleState;
|
||||
ClipCursorToggleState ? dxw.SetClipCursor() : dxw.EraseClipCursor();
|
||||
}
|
||||
break;
|
||||
case DXVK_REFRESH:
|
||||
dxw.ScreenRefresh();
|
||||
break;
|
||||
case DXVK_LOGTOGGLE:
|
||||
dx_ToggleLogging();
|
||||
break;
|
||||
case DXVK_PLOCKTOGGLE:
|
||||
dx_TogglePositionLock(hwnd);
|
||||
break;
|
||||
case DXVK_FPSTOGGLE:
|
||||
dx_ToggleFPS();
|
||||
break;
|
||||
case DXVK_CORNERIZE:
|
||||
dx_Cornerize(hwnd);
|
||||
break;
|
||||
case DXVK_TIMEFAST:
|
||||
case DXVK_TIMESLOW:
|
||||
if (dxw.dwFlags2 & TIMESTRETCH) {
|
||||
if (DxWndKey == DXVK_TIMESLOW && (dxw.TimeShift < 8)) dxw.TimeShift++;
|
||||
if (DxWndKey == DXVK_TIMEFAST && (dxw.TimeShift > -8)) dxw.TimeShift--;
|
||||
GetHookInfo()->TimeShift=dxw.TimeShift;
|
||||
OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption());
|
||||
}
|
||||
break;
|
||||
case DXVK_TIMETOGGLE:
|
||||
if (dxw.dwFlags2 & TIMESTRETCH) {
|
||||
if(TimeShiftToggle){
|
||||
SaveTimeShift=dxw.TimeShift;
|
||||
dxw.TimeShift=0;
|
||||
}
|
||||
else{
|
||||
dxw.TimeShift=SaveTimeShift;
|
||||
}
|
||||
TimeShiftToggle = !TimeShiftToggle;
|
||||
GetHookInfo()->TimeShift=dxw.TimeShift;
|
||||
}
|
||||
break;
|
||||
case DXVK_ALTF4:
|
||||
if (dxw.dwFlags1 & HANDLEALTF4) {
|
||||
OutTraceDW("WindowProc: WM_SYSKEYDOWN(ALT-F4) - terminating process\n");
|
||||
TerminateProcess(GetCurrentProcess(),0);
|
||||
}
|
||||
break;
|
||||
case DXVK_PRINTSCREEN:
|
||||
DDrawScreenShot();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (dxw.dwFlags1 & AUTOREFRESH) dxw.ScreenRefresh();
|
||||
|
||||
pWindowProc=dxwws.GetProc(hwnd);
|
||||
//OutTraceB("WindowProc: pWindowProc=%x extWindowProc=%x message=%x(%s) wparam=%x lparam=%x\n",
|
||||
// (*pWindowProc), extWindowProc, message, ExplainWinMessage(message), wparam, lparam);
|
||||
if(pWindowProc) {
|
||||
LRESULT ret;
|
||||
|
||||
// v2.02.36: use CallWindowProc that handles WinProc handles
|
||||
ret=(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam);
|
||||
|
||||
// save last NCHITTEST cursor position for use with KEEPASPECTRATIO scaling
|
||||
if(message==WM_NCHITTEST) LastCursorPos=ret;
|
||||
// v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages
|
||||
if(dxw.dwFlags2 & FORCEWINRESIZE){
|
||||
switch(message){
|
||||
//case WM_NCHITTEST:
|
||||
//case WM_NCPAINT:
|
||||
//case WM_NCMOUSEMOVE:
|
||||
//case WM_NCCALCSIZE:
|
||||
//case WM_NCACTIVATE:
|
||||
case WM_SETCURSOR: // shows a different cursor when moving on borders
|
||||
case WM_NCLBUTTONDOWN: // intercepts mouse down on borders
|
||||
case WM_NCLBUTTONUP: // intercepts mouse up on borders
|
||||
ret=(*pDefWindowProcA)(hwnd, message, wparam, lparam);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//OutTraceDW("ASSERT: WindowProc mismatch hwnd=%x\n", hwnd);
|
||||
// ??? maybe it's a normal condition, whenever you don't have a WindowProc routine
|
||||
// like in Commandos 2. Flag it?
|
||||
char sMsg[81];
|
||||
sprintf(sMsg,"ASSERT: WindowProc mismatch hwnd=%x\n", hwnd);
|
||||
OutTraceDW(sMsg);
|
||||
if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION);
|
||||
return (*pDefWindowProcA)(hwnd, message, wparam, lparam);
|
||||
}
|
||||
|
||||
void HookSysLibsInit()
|
||||
{
|
||||
static BOOL DoOnce = FALSE;
|
||||
@ -1227,7 +675,7 @@ static void SaveScreenMode()
|
||||
InitDevMode.dmPelsWidth, InitDevMode.dmPelsHeight, InitDevMode.dmBitsPerPel);
|
||||
}
|
||||
|
||||
static void RecoverScreenMode()
|
||||
void RecoverScreenMode()
|
||||
{
|
||||
DEVMODE CurrentDevMode;
|
||||
BOOL res;
|
||||
@ -1480,54 +928,6 @@ void SetSingleProcessAffinity(void)
|
||||
OutTraceE("SetProcessAffinityMask: ERROR err=%d\n", GetLastError());
|
||||
}
|
||||
|
||||
extern HHOOK hMouseHook;
|
||||
|
||||
LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
static BOOL SizeMoving = FALSE;
|
||||
|
||||
if(code == HC_ACTION){
|
||||
if(dxw.IsFullScreen()){
|
||||
MSG *msg;
|
||||
msg = (MSG *)lParam;
|
||||
OutTraceC("MessageHook: hwnd=%x message=%d(%s) remove=%d pt=(%d,%d)\n",
|
||||
msg->hwnd, msg->message, ExplainWinMessage(msg->message), msg->wParam, msg->pt.x, msg->pt.y);
|
||||
|
||||
switch(msg->message){
|
||||
case WM_ENTERSIZEMOVE: SizeMoving = TRUE; break;
|
||||
case WM_EXITSIZEMOVE: SizeMoving = FALSE; break;
|
||||
}
|
||||
|
||||
// do not try to fix coordinates for points outside the client area!!
|
||||
// in theory, that should primarily depend on the message type, but this is the way it works ...
|
||||
// do not do the fixing also when in sizemove mode
|
||||
RECT client;
|
||||
client=dxw.GetUnmappedScreenRect();
|
||||
if ((SizeMoving) ||
|
||||
(msg->pt.x < client.left) ||
|
||||
(msg->pt.y < client.top) ||
|
||||
(msg->pt.x > client.right) ||
|
||||
(msg->pt.y > client.bottom)){
|
||||
// do nothing
|
||||
}
|
||||
else {
|
||||
// fix the message point coordinates
|
||||
POINT upleft={0,0};
|
||||
// v2.03.36: offset to be calculated from target window
|
||||
(*pClientToScreen)(msg->hwnd, &upleft);
|
||||
msg->pt = dxw.SubCoordinates(msg->pt, upleft);
|
||||
msg->pt=dxw.FixCursorPos(msg->pt);
|
||||
// beware: needs fix for mousewheel?
|
||||
if((msg->message <= WM_MOUSELAST) && (msg->message >= WM_MOUSEFIRST)) msg->lParam = MAKELPARAM(msg->pt.x, msg->pt.y);
|
||||
OutTraceC("MessageHook: fixed lparam/pt=(%d,%d)\n", msg->pt.x, msg->pt.y);
|
||||
GetHookInfo()->CursorX=(short)msg->pt.x;
|
||||
GetHookInfo()->CursorY=(short)msg->pt.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
return CallNextHookEx(hMouseHook, code, wParam, lParam);
|
||||
}
|
||||
|
||||
static void ReplaceRDTSC()
|
||||
{
|
||||
typedef BOOL (WINAPI *GetModuleInformation_Type)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
|
||||
@ -1734,6 +1134,8 @@ HWND CreateVirtualDesktop(LPRECT TargetPos)
|
||||
}
|
||||
}
|
||||
|
||||
extern HHOOK hMouseHook;
|
||||
|
||||
void HookInit(TARGETMAP *target, HWND hwnd)
|
||||
{
|
||||
HMODULE base;
|
||||
|
@ -327,15 +327,6 @@ POINT dxwCore::FixCursorPos(POINT prev)
|
||||
}
|
||||
|
||||
if(dxw.dwFlags4 & RELEASEMOUSE){
|
||||
#if 0
|
||||
if ((curr.x < 0) ||
|
||||
(curr.y < 0) ||
|
||||
(curr.x > w) ||
|
||||
(curr.y > h)){
|
||||
curr.x = w / 2;
|
||||
curr.y = h / 2;
|
||||
}
|
||||
#else
|
||||
if ((curr.x < 0) || (curr.y < 0) || (curr.x > w) || (curr.y > h)){
|
||||
if(IsWithin){
|
||||
int RestX, RestY;
|
||||
@ -356,7 +347,6 @@ POINT dxwCore::FixCursorPos(POINT prev)
|
||||
IsWithin = TRUE;
|
||||
LastPos = curr;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
if (curr.x < 0) curr.x = 0;
|
||||
@ -369,18 +359,18 @@ POINT dxwCore::FixCursorPos(POINT prev)
|
||||
if (h) curr.y = (curr.y * dxw.GetScreenHeight()) / h;
|
||||
}
|
||||
|
||||
if(dxw.dwFlags4 & FRAMECOMPENSATION){
|
||||
static int dx, dy, todo=TRUE;
|
||||
if (todo){
|
||||
POINT FrameOffset = dxw.GetFrameOffset();
|
||||
dx=FrameOffset.x;
|
||||
dy=FrameOffset.y;
|
||||
OutTraceC("GetCursorPos: frame compensation=(%d,%d)\n", dx, dy);
|
||||
todo=FALSE;
|
||||
}
|
||||
curr.x += dx;
|
||||
curr.y += dy;
|
||||
}
|
||||
//if(dxw.dwFlags4 & FRAMECOMPENSATION){
|
||||
// static int dx, dy, todo=TRUE;
|
||||
// if (todo){
|
||||
// POINT FrameOffset = dxw.GetFrameOffset();
|
||||
// dx=FrameOffset.x;
|
||||
// dy=FrameOffset.y;
|
||||
// OutTraceC("GetCursorPos: frame compensation=(%d,%d)\n", dx, dy);
|
||||
// todo=FALSE;
|
||||
// }
|
||||
// curr.x += dx;
|
||||
// curr.y += dy;
|
||||
//}
|
||||
|
||||
if((dxw.dwFlags1 & ENABLECLIPPING) && lpClipRegion){
|
||||
// v2.1.93:
|
||||
|
@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "TlHelp32.h"
|
||||
|
||||
#define VERSION "2.03.40"
|
||||
#define VERSION "2.03.41"
|
||||
|
||||
#define DDTHREADLOCK 1
|
||||
//#define LOCKTHREADS
|
||||
|
Binary file not shown.
@ -445,6 +445,10 @@
|
||||
RelativePath=".\kernel32.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\msghook.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\msvfw.cpp"
|
||||
>
|
||||
@ -469,6 +473,10 @@
|
||||
RelativePath=".\winmm.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\winproc.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\wintrust.cpp"
|
||||
>
|
||||
|
@ -42,6 +42,9 @@ COLORREF WINAPI extSetBkColor(HDC, COLORREF);
|
||||
COLORREF WINAPI extSetTextColor(HDC hdc, COLORREF crColor);
|
||||
int WINAPI extSetBkMode(HDC, int);
|
||||
*/
|
||||
typedef int (WINAPI *SetDIBits_Type)(HDC, HBITMAP, UINT, UINT, const VOID *, const BITMAPINFO *, UINT);
|
||||
int WINAPI extSetDIBits(HDC, HBITMAP, UINT, UINT, const VOID *, const BITMAPINFO *, UINT);
|
||||
SetDIBits_Type pSetDIBits = NULL;
|
||||
|
||||
static HookEntry_Type Hooks[]={
|
||||
|
||||
@ -56,14 +59,12 @@ static HookEntry_Type Hooks[]={
|
||||
{HOOK_HOT_CANDIDATE, "GetSystemPaletteEntries", (FARPROC)GetSystemPaletteEntries, (FARPROC *)&pGDIGetSystemPaletteEntries, (FARPROC)extGetSystemPaletteEntries},
|
||||
{HOOK_HOT_CANDIDATE, "SetSystemPaletteUse", (FARPROC)SetSystemPaletteUse, (FARPROC *)&pSetSystemPaletteUse, (FARPROC)extSetSystemPaletteUse},
|
||||
{HOOK_IAT_CANDIDATE, "StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits},
|
||||
//{HOOK_IAT_CANDIDATE, "SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice},
|
||||
//{HOOK_IAT_CANDIDATE, "CreateCompatibleBitmap", (FARPROC)NULL, (FARPROC *)&pCreateCompatibleBitmap, (FARPROC)extCreateCompatibleBitmap},
|
||||
//{HOOK_IAT_CANDIDATE, "SetMapMode", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extSetMapMode},
|
||||
{HOOK_IAT_CANDIDATE, "SetPixelFormat", (FARPROC)NULL, (FARPROC *)&pGDISetPixelFormat, (FARPROC)extGDISetPixelFormat},
|
||||
{HOOK_IAT_CANDIDATE, "GetPixelFormat", (FARPROC)NULL, (FARPROC *)&pGDIGetPixelFormat, (FARPROC)extGDIGetPixelFormat},
|
||||
{HOOK_IAT_CANDIDATE, "ChoosePixelFormat", (FARPROC)NULL, (FARPROC *)&pChoosePixelFormat, (FARPROC)extChoosePixelFormat},
|
||||
{HOOK_IAT_CANDIDATE, "DescribePixelFormat", (FARPROC)NULL, (FARPROC *)&pDescribePixelFormat, (FARPROC)extDescribePixelFormat},
|
||||
|
||||
{HOOK_HOT_CANDIDATE, "GetPaletteEntries", (FARPROC)GetPaletteEntries, (FARPROC *)&pGetPaletteEntries, (FARPROC)extGetPaletteEntries},
|
||||
{HOOK_HOT_CANDIDATE, "GetSystemPaletteUse", (FARPROC)GetSystemPaletteUse, (FARPROC *)&pGetSystemPaletteUse, (FARPROC)extGetSystemPaletteUse},
|
||||
#ifdef TRACEPALETTE
|
||||
@ -84,6 +85,7 @@ static HookEntry_Type RemapHooks[]={
|
||||
{HOOK_IAT_CANDIDATE, "SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice}, // does the stretching
|
||||
{HOOK_IAT_CANDIDATE, "GetRgnBox", (FARPROC)NULL, (FARPROC *)&pGetRgnBox, (FARPROC)extGetRgnBox},
|
||||
//{HOOK_IAT_CANDIDATE, "GetRegionData", (FARPROC)NULL, (FARPROC *)&pGetRegionData, (FARPROC)extGetRegionData},
|
||||
//{HOOK_HOT_CANDIDATE, "SetDIBits", (FARPROC)SetDIBits, (FARPROC *)&pSetDIBits, (FARPROC)extSetDIBits},
|
||||
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
|
||||
};
|
||||
|
||||
@ -644,6 +646,13 @@ UINT WINAPI extGetPaletteEntries(HPALETTE hpal, UINT iStartIndex, UINT nEntries,
|
||||
OutTraceDW("GDI.GetPaletteEntries: hpal=%x iStartIndex=%d nEntries=%d\n", hpal, iStartIndex, nEntries);
|
||||
res=(*pGetPaletteEntries)(hpal, iStartIndex, nEntries, lppe);
|
||||
OutTraceDW("GDI.GetPaletteEntries: res-nEntries=%d\n", res);
|
||||
if(hpal==0) {
|
||||
if((res == 0) && (dxw.dwFlags1 & EMULATESURFACE)) {
|
||||
res = extGetSystemPaletteEntries(0, iStartIndex, nEntries, lppe);
|
||||
mySetPalette(iStartIndex, nEntries, lppe);
|
||||
}
|
||||
res=(nEntries > 256) ? nEntries : 256; // "M.I.B." patch ....
|
||||
}
|
||||
if(IsDebug && res) dxw.DumpPalette(res, &lppe[iStartIndex]);
|
||||
//mySetPalette(0, nEntries, lppe);
|
||||
return res;
|
||||
@ -1159,6 +1168,23 @@ int WINAPI extStretchDIBits(HDC hdc, int XDest, int YDest, int nDestWidth, int n
|
||||
return ret;
|
||||
}
|
||||
|
||||
int WINAPI extSetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT cScanLines, const VOID *lpvBits, const BITMAPINFO *lpbmi, UINT fuColorUse)
|
||||
{
|
||||
int ret;
|
||||
BITMAPINFOHEADER *bmi;
|
||||
OutTraceDW("SetDIBits: hdc=%x hbmp=%x lines=(%d,%d) ColorUse=%x\n", hdc, hbmp, uStartScan, cScanLines, fuColorUse);
|
||||
bmi=(BITMAPINFOHEADER *)&(lpbmi->bmiHeader);
|
||||
OutTraceDW("SetDIBits: BitmapInfo dim=(%dx%d) Planes=%d BPP=%d Compression=%x SizeImage=%x\n",
|
||||
bmi->biWidth, bmi->biHeight, bmi->biPlanes, bmi->biBitCount, bmi->biCompression, bmi->biSizeImage);
|
||||
ret = (*pSetDIBits)(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse);
|
||||
OutTraceDW("SetDIBits: ret=%d\n", ret);
|
||||
return ret;
|
||||
|
||||
//return cScanLines;
|
||||
//return (*pSetDIBits)(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, DIB_PAL_COLORS);
|
||||
//return (*pSetDIBits)(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, DIB_RGB_COLORS);
|
||||
}
|
||||
|
||||
int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DWORD dwHeight, int XSrc, int YSrc, UINT uStartScan, UINT cScanLines,
|
||||
const VOID *lpvBits, const BITMAPINFO *lpbmi, UINT fuColorUse)
|
||||
{
|
||||
|
64
dll/msghook.cpp
Normal file
64
dll/msghook.cpp
Normal file
@ -0,0 +1,64 @@
|
||||
#define _WIN32_WINNT 0x0600
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include "dxwnd.h"
|
||||
#include "dxwcore.hpp"
|
||||
#include "dxhelper.h"
|
||||
|
||||
extern HHOOK hMouseHook;
|
||||
|
||||
LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
static BOOL SizeMoving = FALSE;
|
||||
|
||||
if(code == HC_ACTION){
|
||||
if(dxw.IsFullScreen()){
|
||||
MSG *msg;
|
||||
msg = (MSG *)lParam;
|
||||
OutTraceC("MessageHook: hwnd=%x message=%d(%s) remove=%d pt=(%d,%d)\n",
|
||||
msg->hwnd, msg->message, ExplainWinMessage(msg->message), msg->wParam, msg->pt.x, msg->pt.y);
|
||||
|
||||
switch(msg->message){
|
||||
case WM_ENTERSIZEMOVE: SizeMoving = TRUE; break;
|
||||
case WM_EXITSIZEMOVE: SizeMoving = FALSE; break;
|
||||
}
|
||||
|
||||
// do not try to fix coordinates for points outside the client area!!
|
||||
// in theory, that should primarily depend on the message type, but this is the way it works ...
|
||||
// do not do the fixing also when in sizemove mode
|
||||
RECT client;
|
||||
client=dxw.GetUnmappedScreenRect();
|
||||
if ((SizeMoving) ||
|
||||
(msg->pt.x < client.left) ||
|
||||
(msg->pt.y < client.top) ||
|
||||
(msg->pt.x > client.right) ||
|
||||
(msg->pt.y > client.bottom)){
|
||||
// do nothing
|
||||
}
|
||||
else {
|
||||
// fix the message point coordinates
|
||||
POINT upleft={0,0};
|
||||
POINT pt;
|
||||
// v2.03.36: offset to be calculated from target window
|
||||
(*pClientToScreen)(msg->hwnd, &upleft);
|
||||
pt = msg->pt;
|
||||
pt = dxw.SubCoordinates(pt, upleft);
|
||||
pt=dxw.FixCursorPos(pt);
|
||||
msg->pt = pt;
|
||||
// beware: needs fix for mousewheel?
|
||||
// if NOMOUSEPROC fix point x,y coordinates only to NON MOUSE messages that won't be fixed by WindowProc hooker
|
||||
// NOMOUSEPROC is required by "X-Files", must be off for "Star Trek Armada" !!!
|
||||
// if((msg->message <= WM_MOUSELAST) && (msg->message >= WM_MOUSEFIRST) && !(dxw.dwFlags6 & NOMOUSEPROC)) msg->lParam = MAKELPARAM(pt.x, pt.y);
|
||||
if((msg->message <= WM_MOUSELAST) && (msg->message >= WM_MOUSEFIRST)) msg->lParam = MAKELPARAM(pt.x, pt.y);
|
||||
OutTraceC("MessageHook: fixed hwnd=%x lparam/pt=(%d,%d)\n", msg->hwnd, pt.x, pt.y);
|
||||
GetHookInfo()->CursorX=(short)pt.x;
|
||||
GetHookInfo()->CursorY=(short)pt.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
return CallNextHookEx(hMouseHook, code, wParam, lParam);
|
||||
}
|
@ -664,7 +664,7 @@ LONG WINAPI extGetWindowLong(GetWindowLong_Type pGetWindowLong, char *ApiName, H
|
||||
|
||||
res=(*pGetWindowLong)(hwnd, nIndex);
|
||||
|
||||
OutTraceDW("%s: hwnd=%x, Index=%x(%s) res=%x\n", ApiName, hwnd, nIndex, ExplainSetWindowIndex(nIndex), res);
|
||||
OutTraceB("%s: hwnd=%x, Index=%x(%s) res=%x\n", ApiName, hwnd, nIndex, ExplainSetWindowIndex(nIndex), res);
|
||||
|
||||
if((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)){
|
||||
WNDPROC wp;
|
||||
@ -731,7 +731,9 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon
|
||||
}
|
||||
}
|
||||
|
||||
if (((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)) && dxw.IsFullScreen()){ // v2.02.51 - see A10 Cuba....
|
||||
if (((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)) &&
|
||||
dxw.IsFullScreen() && // v2.02.51 - see A10 Cuba....
|
||||
!(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug flag
|
||||
WNDPROC lres;
|
||||
WNDPROC OldProc;
|
||||
// GPL fix
|
||||
@ -990,6 +992,7 @@ BOOL WINAPI extSetCursorPos(int x, int y)
|
||||
}
|
||||
|
||||
if(dxw.dwFlags1 & MODIFYMOUSE){
|
||||
#if 0
|
||||
POINT cur;
|
||||
RECT rect;
|
||||
|
||||
@ -1018,6 +1021,15 @@ BOOL WINAPI extSetCursorPos(int x, int y)
|
||||
}
|
||||
x = cur.x;
|
||||
y = cur.y;
|
||||
#else
|
||||
// v2.03.41
|
||||
POINT cur;
|
||||
cur.x = x;
|
||||
cur.y = y;
|
||||
dxw.MapWindow(&cur);
|
||||
x = cur.x;
|
||||
y = cur.y;
|
||||
#endif
|
||||
}
|
||||
|
||||
res=0;
|
||||
@ -1319,6 +1331,8 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName)
|
||||
long res;
|
||||
WNDPROC pWindowProc;
|
||||
|
||||
if(dxw.dwFlags6 & NOWINDOWHOOKS) return;
|
||||
|
||||
pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC);
|
||||
if((pWindowProc == extWindowProc) ||
|
||||
(pWindowProc == extChildWindowProc) ||
|
||||
@ -2138,7 +2152,8 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT
|
||||
dxw.SetFullScreen(FullScreen);
|
||||
|
||||
// v2.02.73: redirect lpDialogFunc only when it is nor NULL
|
||||
if(lpDialogFunc) {
|
||||
if( lpDialogFunc &&
|
||||
!(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug option
|
||||
dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc);
|
||||
if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc))
|
||||
OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__);
|
||||
@ -2161,7 +2176,8 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW
|
||||
dxw.SetFullScreen(FullScreen);
|
||||
|
||||
// v2.02.73: redirect lpDialogFunc only when it is nor NULL: fix for "LEGO Stunt Rally"
|
||||
if(lpDialogFunc) {
|
||||
if( lpDialogFunc &&
|
||||
!(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug option
|
||||
dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc);
|
||||
if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc))
|
||||
OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__);
|
||||
@ -2916,9 +2932,8 @@ BOOL WINAPI extSetForegroundWindow(HWND hwnd)
|
||||
return res;
|
||||
}
|
||||
|
||||
HOOKPROC glpMouseHookProcessFunction;
|
||||
HOOKPROC glpMessageHookProcessFunction;
|
||||
/*
|
||||
HOOKPROC glpMouseHookProcessFunction;
|
||||
LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT ret;
|
||||
@ -2932,6 +2947,8 @@ LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
*/
|
||||
|
||||
HOOKPROC glpMessageHookProcessFunction;
|
||||
|
||||
LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT ret;
|
||||
@ -2941,7 +2958,9 @@ LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam)
|
||||
if(pMessage){
|
||||
UINT message = pMessage->message;
|
||||
if ((message >= 0x600) || // custom messages
|
||||
((message >= WM_KEYFIRST) && (message <= WM_KEYLAST))) // keyboard messages
|
||||
((message >= WM_KEYFIRST) && (message <= WM_KEYLAST)) || // keyboard messages
|
||||
((message >= WM_MOUSEFIRST) && (message <= WM_MOUSELAST)) // mouse messages
|
||||
)
|
||||
ret = (*glpMessageHookProcessFunction)(code, wParam, lParam);
|
||||
}
|
||||
return ret;
|
||||
|
591
dll/winproc.cpp
Normal file
591
dll/winproc.cpp
Normal file
@ -0,0 +1,591 @@
|
||||
#define _WIN32_WINNT 0x0600
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include "dxwnd.h"
|
||||
#include "dxwcore.hpp"
|
||||
#include "dxhelper.h"
|
||||
|
||||
extern void SuppressIMEWindow();
|
||||
extern void RecoverScreenMode();
|
||||
|
||||
static void dx_ToggleLogging()
|
||||
{
|
||||
// toggle LOGGING
|
||||
if(dxw.dwTFlags & OUTTRACE){
|
||||
OutTraceDW("Toggle logging OFF\n");
|
||||
dxw.dwTFlags &= ~OUTTRACE;
|
||||
}
|
||||
else {
|
||||
dxw.dwTFlags |= OUTTRACE;
|
||||
OutTraceDW("Toggle logging ON\n");
|
||||
}
|
||||
GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK extDialogWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
static int i=0;
|
||||
static WINDOWPOS *wp;
|
||||
WNDPROC pWindowProc;
|
||||
LRESULT res;
|
||||
static int t = -1;
|
||||
static int iRecursion = 0;
|
||||
|
||||
if(iRecursion) {
|
||||
iRecursion=0;
|
||||
return NULL;
|
||||
}
|
||||
iRecursion++;
|
||||
|
||||
if (t == -1)
|
||||
t = (*pGetTickCount)();
|
||||
int tn = (*pGetTickCount)();
|
||||
|
||||
OutTraceW("DEBUG: DialogWinMsg hwnd=%x msg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
|
||||
// optimization: don't invalidate too often!
|
||||
// 200mSec seems a good compromise.
|
||||
if (tn-t > 200) {
|
||||
(*pInvalidateRect)(hwnd, NULL, TRUE);
|
||||
t=tn;
|
||||
}
|
||||
|
||||
pWindowProc=dxwws.GetProc(hwnd);
|
||||
if(pWindowProc) {
|
||||
res =(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam);
|
||||
}
|
||||
else {
|
||||
char *sMsg="ASSERT: DialogWinMsg pWindowProc=NULL !!!\n";
|
||||
OutTraceDW(sMsg);
|
||||
if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION);
|
||||
res = NULL;
|
||||
}
|
||||
iRecursion=0;
|
||||
return res;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK extChildWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
static int i=0;
|
||||
static WINDOWPOS *wp;
|
||||
WNDPROC pWindowProc;
|
||||
|
||||
OutTraceW("DEBUG: ChildWinMsg hwnd=%x msg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
|
||||
if(dxw.Windowize){
|
||||
switch(message){
|
||||
// Cybermercs: it seems that all game menus are conveniently handled by the WindowProc routine,
|
||||
// while the action screen get messages processed by the ChildWindowProc, that needs some different
|
||||
// setting ..........
|
||||
// Beware: Cybermercs handles some static info about cursor position handling, so that if you resize
|
||||
// a menu it doesn't work correctly until you don't change screen.
|
||||
case WM_MOUSEMOVE:
|
||||
case WM_MOUSEWHEEL:
|
||||
case WM_LBUTTONDOWN:
|
||||
case WM_LBUTTONUP:
|
||||
case WM_LBUTTONDBLCLK:
|
||||
case WM_RBUTTONDOWN:
|
||||
case WM_RBUTTONUP:
|
||||
case WM_RBUTTONDBLCLK:
|
||||
case WM_MBUTTONDOWN:
|
||||
case WM_MBUTTONUP:
|
||||
case WM_MBUTTONDBLCLK:
|
||||
// if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
|
||||
//if((dxw.dwFlags1 & MODIFYMOUSE) && !(dxw.dwFlags6 & NOMOUSEPROC)){ // mouse processing
|
||||
if((dxw.dwFlags1 & MODIFYMOUSE) && !(dxw.dwFlags1 & MESSAGEPROC)){ // mouse processing
|
||||
POINT prev, curr;
|
||||
// scale mouse coordinates
|
||||
prev.x = LOWORD(lparam);
|
||||
prev.y = HIWORD(lparam);
|
||||
curr = prev;
|
||||
if(message == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix
|
||||
POINT upleft={0,0};
|
||||
(*pClientToScreen)(dxw.GethWnd(), &upleft);
|
||||
curr = dxw.SubCoordinates(curr, upleft);
|
||||
}
|
||||
//OutTraceC("ChildWindowProc: hwnd=%x pos XY prev=(%d,%d)\n", hwnd, prev.x, prev.y);
|
||||
curr=dxw.FixCursorPos(curr); // Warn! the correction must refer to the main window hWnd, not the current hwnd one !!!
|
||||
lparam = MAKELPARAM(curr.x, curr.y);
|
||||
OutTraceC("ChildWindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pWindowProc=dxwws.GetProc(hwnd);
|
||||
|
||||
// v2.02.82: use CallWindowProc that handles WinProc handles
|
||||
if(pWindowProc) return(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam);
|
||||
// should never get here ....
|
||||
OutTraceDW("ChildWindowProc: no WndProc for CHILD hwnd=%x\n", hwnd);
|
||||
return DefWindowProc(hwnd, message, wparam, lparam);
|
||||
}
|
||||
|
||||
static void dx_UpdatePositionLock(HWND hwnd)
|
||||
{
|
||||
RECT rect;
|
||||
POINT p={0,0};
|
||||
(*pGetClientRect)(hwnd,&rect);
|
||||
(*pClientToScreen)(hwnd,&p);
|
||||
dxw.dwFlags1 |= LOCKWINPOS;
|
||||
OutTraceDW("Toggle position lock ON\n");
|
||||
dxw.InitWindowPos(p.x, p.y, rect.right-rect.left, rect.bottom-rect.top);
|
||||
}
|
||||
|
||||
static void dx_TogglePositionLock(HWND hwnd)
|
||||
{
|
||||
// toggle position locking
|
||||
if(dxw.dwFlags1 & LOCKWINPOS){
|
||||
// unlock
|
||||
OutTraceDW("Toggle position lock OFF\n");
|
||||
dxw.dwFlags1 &= ~LOCKWINPOS;
|
||||
}
|
||||
else {
|
||||
OutTraceDW("Toggle position lock ON\n");
|
||||
dxw.dwFlags1 |= LOCKWINPOS;
|
||||
dx_UpdatePositionLock(hwnd);
|
||||
}
|
||||
}
|
||||
|
||||
static void dx_ToggleFPS()
|
||||
{
|
||||
if(dxw.dwFlags2 & SHOWFPS){
|
||||
dxw.dwFlags2 &= ~SHOWFPS;
|
||||
OutTrace("ToggleFPS: SHOWFPS mode OFF\n");
|
||||
}
|
||||
else {
|
||||
dxw.dwFlags2 |= SHOWFPS;
|
||||
OutTrace("ToggleFPS: SHOWFPS mode ON\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void dx_Cornerize(HWND hwnd)
|
||||
{
|
||||
static RECT WinRect = {0, 0, 0, 0};
|
||||
static DWORD OldStyle, OldExtStyle;
|
||||
// toggle ....
|
||||
if (WinRect.right == 0){
|
||||
OutTraceDW("DxWnd: entering corner mode\n");
|
||||
(*pGetWindowRect)(hwnd, &WinRect);
|
||||
OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE);
|
||||
OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
|
||||
(*pSetWindowLongA)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED);
|
||||
(*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0);
|
||||
(*pMoveWindow)(hwnd, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), TRUE);
|
||||
}
|
||||
else {
|
||||
OutTraceDW("DxWnd: exiting corner mode\n");
|
||||
(*pSetWindowLongA)(hwnd, GWL_STYLE, OldStyle);
|
||||
(*pSetWindowLongA)(hwnd, GWL_EXSTYLE, OldExtStyle);
|
||||
(*pMoveWindow)(hwnd, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom, TRUE);
|
||||
memset(&WinRect, 0, sizeof(WinRect));
|
||||
}
|
||||
(*pUpdateWindow)(hwnd);
|
||||
dxw.ScreenRefresh();
|
||||
}
|
||||
|
||||
LRESULT LastCursorPos;
|
||||
|
||||
LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
POINT prev, curr;
|
||||
RECT rect;
|
||||
static int i=0;
|
||||
static int ClipCursorToggleState = 1;
|
||||
WNDPROC pWindowProc;
|
||||
extern void dxwFixWindowPos(char *, HWND, LPARAM);
|
||||
extern LPRECT lpClipRegion;
|
||||
static BOOL DoOnce = TRUE;
|
||||
static BOOL IsToBeLocked;
|
||||
static int LastTimeShift;
|
||||
static int SaveTimeShift;
|
||||
static BOOL TimeShiftToggle=TRUE;
|
||||
extern void DDrawScreenShot();
|
||||
|
||||
if(DoOnce){
|
||||
DoOnce=FALSE;
|
||||
IsToBeLocked=(dxw.dwFlags1 & LOCKWINPOS);
|
||||
LastTimeShift=SaveTimeShift=dxw.TimeShift;
|
||||
}
|
||||
|
||||
// v2.1.93: adjust clipping region
|
||||
|
||||
if(IsTraceW){
|
||||
char sPos[161];
|
||||
sPos[160]=0;
|
||||
sPos[0]=0;
|
||||
switch(message){
|
||||
case WM_WINDOWPOSCHANGING:
|
||||
case WM_WINDOWPOSCHANGED:
|
||||
LPWINDOWPOS wp;
|
||||
wp = (LPWINDOWPOS)lparam;
|
||||
sprintf_s(sPos, 160, " pos=(%d,%d) size=(%dx%d) flags=%x(%s)", wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags));
|
||||
break;
|
||||
case WM_MOVE:
|
||||
sprintf_s(sPos, 160, " pos=(%d,%d)", HIWORD(lparam), LOWORD(lparam));
|
||||
break;
|
||||
case WM_SIZE:
|
||||
static char *modes[5]={"RESTORED", "MINIMIZED", "MAXIMIZED", "MAXSHOW", "MAXHIDE"};
|
||||
sprintf_s(sPos, 160, " mode=SIZE_%s size=(%dx%d)", modes[wparam % 5], HIWORD(lparam), LOWORD(lparam));
|
||||
break;
|
||||
}
|
||||
OutTrace("WindowProc[%x]: WinMsg=[0x%x]%s(%x,%x) %s\n", hwnd, message, ExplainWinMessage(message), wparam, lparam, sPos);
|
||||
}
|
||||
|
||||
if(dxw.dwFlags3 & FILTERMESSAGES){
|
||||
switch(message){
|
||||
case WM_NCMOUSEMOVE:
|
||||
case WM_NCLBUTTONDOWN:
|
||||
case WM_NCLBUTTONUP:
|
||||
case WM_NCLBUTTONDBLCLK:
|
||||
case WM_NCRBUTTONDOWN:
|
||||
case WM_NCRBUTTONUP:
|
||||
case WM_NCRBUTTONDBLCLK:
|
||||
case WM_NCMBUTTONDOWN:
|
||||
case WM_NCMBUTTONUP:
|
||||
case WM_NCMBUTTONDBLCLK:
|
||||
OutTraceDW("WindowProc[%x]: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(LastTimeShift != dxw.TimeShift){
|
||||
extern void SetVSyncDelays(LPDIRECTDRAW);
|
||||
extern LPDIRECTDRAW lpPrimaryDD;
|
||||
if(dxw.dwFlags4 & STRETCHTIMERS) dxw.RenewTimers();
|
||||
if(lpPrimaryDD) SetVSyncDelays(lpPrimaryDD);
|
||||
LastTimeShift=dxw.TimeShift;
|
||||
}
|
||||
|
||||
switch(message){
|
||||
// v2.02.13: added WM_GETMINMAXINFO/WM_NCCALCSIZE interception - (see Actua Soccer 3 problems...)
|
||||
//case WM_NCDESTROY:
|
||||
// return 0;
|
||||
case WM_GETMINMAXINFO:
|
||||
if(dxw.dwFlags1 & LOCKWINPOS){
|
||||
extern void dxwFixMinMaxInfo(char *, HWND, LPARAM);
|
||||
dxwFixMinMaxInfo("WindowProc", hwnd, lparam);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case WM_NCCALCSIZE:
|
||||
case WM_NCPAINT:
|
||||
if((dxw.dwFlags1 & LOCKWINPOS) && (hwnd == dxw.GethWnd()) && dxw.IsFullScreen()){ // v2.02.30: don't alter child and other windows....
|
||||
OutTraceDW("WindowProc: %s wparam=%x\n", ExplainWinMessage(message), wparam);
|
||||
return (*pDefWindowProcA)(hwnd, message, wparam, lparam);
|
||||
}
|
||||
break;
|
||||
case WM_NCCREATE:
|
||||
if(dxw.dwFlags2 & SUPPRESSIME) SuppressIMEWindow();
|
||||
break;
|
||||
case WM_IME_SETCONTEXT:
|
||||
case WM_IME_NOTIFY:
|
||||
case WM_IME_CONTROL:
|
||||
case WM_IME_COMPOSITIONFULL:
|
||||
case WM_IME_SELECT:
|
||||
case WM_IME_CHAR:
|
||||
case WM_IME_REQUEST:
|
||||
case WM_IME_KEYDOWN:
|
||||
case WM_IME_KEYUP:
|
||||
if(dxw.dwFlags2 & SUPPRESSIME){
|
||||
OutTraceDW("WindowProc[%x]: SUPPRESS IME WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), wparam, lparam);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case WM_NCHITTEST:
|
||||
if((dxw.dwFlags2 & FIXNCHITTEST) && (dxw.dwFlags1 & MODIFYMOUSE)){ // mouse processing
|
||||
POINT cursor;
|
||||
LRESULT ret;
|
||||
ret=(*pDefWindowProcA)(hwnd, message, wparam, lparam);
|
||||
if (ret==HTCLIENT) {
|
||||
cursor.x=LOWORD(lparam);
|
||||
cursor.y=HIWORD(lparam);
|
||||
dxw.FixNCHITCursorPos(&cursor);
|
||||
lparam = MAKELPARAM(cursor.x, cursor.y);
|
||||
}
|
||||
else
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
case WM_ERASEBKGND:
|
||||
if(dxw.Windowize && dxw.IsDesktop(hwnd)){
|
||||
OutTraceDW("WindowProc: WM_ERASEBKGND(%x,%x) - suppressed\n", wparam, lparam);
|
||||
return 1; // 1 == OK, erased
|
||||
}
|
||||
break;
|
||||
case WM_DISPLAYCHANGE:
|
||||
if (dxw.Windowize && (dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()){
|
||||
OutTraceDW("WindowProc: prevent WM_DISPLAYCHANGE depth=%d size=(%d,%d)\n",
|
||||
wparam, LOWORD(lparam), HIWORD(lparam));
|
||||
// v2.02.43: unless EMULATESURFACE is set, lock the screen resolution only, but not the color depth!
|
||||
if(dxw.dwFlags1 & EMULATESURFACE) return 0;
|
||||
// let rparam (color depth) change, but override lparam (screen width & height.)
|
||||
lparam = MAKELPARAM((LONG)dxw.GetScreenWidth(), (LONG)dxw.GetScreenHeight());
|
||||
//return 0;
|
||||
}
|
||||
break;
|
||||
case WM_WINDOWPOSCHANGING:
|
||||
case WM_WINDOWPOSCHANGED:
|
||||
if(dxw.Windowize && dxw.IsFullScreen()){
|
||||
if(dxw.dwFlags5 & NOWINPOSCHANGES){
|
||||
OutTraceDW("WindowProc: %s - suppressed\n", message==WM_WINDOWPOSCHANGED ? "WM_WINDOWPOSCHANGED" : "WM_WINDOWPOSCHANGING");
|
||||
return 0;
|
||||
}
|
||||
extern HWND hControlParentWnd;
|
||||
LPWINDOWPOS wp;
|
||||
wp = (LPWINDOWPOS)lparam;
|
||||
dxwFixWindowPos("WindowProc", hwnd, lparam);
|
||||
OutTraceDW("WindowProc: %s fixed size=(%d,%d)\n",
|
||||
(message == WM_WINDOWPOSCHANGED) ? "WM_WINDOWPOSCHANGED" : "WM_WINDOWPOSCHANGING", wp->cx, wp->cy);
|
||||
// try to lock main wind & control parent together
|
||||
if((message==WM_WINDOWPOSCHANGED) && hControlParentWnd){
|
||||
if(dxw.IsDesktop(hwnd)) {
|
||||
POINT fo = dxw.GetFrameOffset();
|
||||
(*pMoveWindow)(hControlParentWnd, wp->x+fo.x, wp->y+fo.y, wp->cx, wp->cy, TRUE);
|
||||
}
|
||||
}
|
||||
// v2.03.30: in window mode, it seems that the WM_ACTIVATEAPP message is not sent to the main win.
|
||||
// this PostMessage call recovers "Thorgal" block at the end of intro movie and "Championship Manager 03 04" cursor
|
||||
if((message==WM_WINDOWPOSCHANGED) && (dxw.dwFlags6 & ACTIVATEAPP)){
|
||||
PostMessage(hwnd, WM_ACTIVATEAPP, 1, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WM_ENTERSIZEMOVE:
|
||||
if(IsToBeLocked){
|
||||
dxw.dwFlags1 &= ~LOCKWINPOS;
|
||||
}
|
||||
while((*pShowCursor)(1) < 0);
|
||||
if(dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor();
|
||||
if(dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL);
|
||||
break;
|
||||
case WM_EXITSIZEMOVE:
|
||||
if(IsToBeLocked){
|
||||
dxw.dwFlags1 |= LOCKWINPOS;
|
||||
dx_UpdatePositionLock(hwnd);
|
||||
}
|
||||
if((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()) while((*pShowCursor)(0) >= 0);
|
||||
if(dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0);
|
||||
if(dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion);
|
||||
if(dxw.dwFlags2 & REFRESHONRESIZE) dxw.ScreenRefresh();
|
||||
if(dxw.dwFlags4 & HIDEDESKTOP) dxw.HideDesktop(dxw.GethWnd());
|
||||
if(dxw.dwFlags5 & CENTERTOWIN) {
|
||||
HDC thdc;
|
||||
HWND w = dxw.GethWnd();
|
||||
RECT client;
|
||||
(*pGetClientRect)(w, &client);
|
||||
thdc=(*pGDIGetDC)(w);
|
||||
if(thdc) (*pGDIBitBlt)(thdc, client.left, client.top, client.right, client.bottom, 0, 0, 0, BLACKNESS);
|
||||
}
|
||||
break;
|
||||
case WM_ACTIVATE:
|
||||
// turn DirectInput bActive flag on & off .....
|
||||
dxw.bActive = (LOWORD(wparam) == WA_ACTIVE || LOWORD(wparam) == WA_CLICKACTIVE) ? 1 : 0;
|
||||
case WM_NCACTIVATE:
|
||||
// turn DirectInput bActive flag on & off .....
|
||||
if(message == WM_NCACTIVATE) dxw.bActive = wparam;
|
||||
if(dxw.bActive) (*pSetWindowPos)(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||
if(dxw.dwFlags1 & UNNOTIFY){
|
||||
DefWindowProc(hwnd, message, wparam, lparam);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case WM_NCMOUSEMOVE:
|
||||
// Posted to a window when the cursor is moved within the nonclient area of the window.
|
||||
// This message is posted to the window that contains the cursor.
|
||||
// If a window has captured the mouse, this message is not posted.
|
||||
// V2.1.90: on nonclient areas the cursor is always shown.
|
||||
while((*pShowCursor)(1) < 0);
|
||||
break;
|
||||
case WM_MOUSEMOVE:
|
||||
if(dxw.Windowize){
|
||||
prev.x = LOWORD(lparam);
|
||||
prev.y = HIWORD(lparam);
|
||||
if ((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()){
|
||||
(*pGetClientRect)(hwnd, &rect);
|
||||
if(prev.x >= 0 && prev.x < rect.right && prev.y >= 0 && prev.y < rect.bottom)
|
||||
while((*pShowCursor)(0) >= 0);
|
||||
else
|
||||
while((*pShowCursor)(1) < 0);
|
||||
}
|
||||
else {
|
||||
while((*pShowCursor)(1) < 0);
|
||||
}
|
||||
//if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
|
||||
//if((dxw.dwFlags1 & MODIFYMOUSE) && !(dxw.dwFlags6 & NOMOUSEPROC)){ // mouse processing
|
||||
if((dxw.dwFlags1 & MODIFYMOUSE) && !(dxw.dwFlags1 & MESSAGEPROC)){ // mouse processing
|
||||
// scale mouse coordinates
|
||||
curr=dxw.FixCursorPos(prev); //v2.02.30
|
||||
lparam = MAKELPARAM(curr.x, curr.y);
|
||||
OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
|
||||
}
|
||||
GetHookInfo()->CursorX=LOWORD(lparam);
|
||||
GetHookInfo()->CursorY=HIWORD(lparam);
|
||||
}
|
||||
break;
|
||||
// fall through cases:
|
||||
case WM_MOUSEWHEEL:
|
||||
case WM_LBUTTONDOWN:
|
||||
case WM_LBUTTONUP:
|
||||
case WM_LBUTTONDBLCLK:
|
||||
case WM_RBUTTONDOWN:
|
||||
case WM_RBUTTONUP:
|
||||
case WM_RBUTTONDBLCLK:
|
||||
case WM_MBUTTONDOWN:
|
||||
case WM_MBUTTONUP:
|
||||
case WM_MBUTTONDBLCLK:
|
||||
if(dxw.Windowize){
|
||||
if((dxw.dwFlags1 & CLIPCURSOR) && ClipCursorToggleState) dxw.SetClipCursor();
|
||||
//if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
|
||||
//if((dxw.dwFlags1 & MODIFYMOUSE) && !(dxw.dwFlags6 & NOMOUSEPROC)){ // mouse processing
|
||||
if((dxw.dwFlags1 & MODIFYMOUSE) && !(dxw.dwFlags1 & MESSAGEPROC)){ // mouse processing
|
||||
// scale mouse coordinates
|
||||
prev.x = LOWORD(lparam);
|
||||
prev.y = HIWORD(lparam);
|
||||
curr = prev;
|
||||
if(message == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix
|
||||
POINT upleft={0,0};
|
||||
(*pClientToScreen)(dxw.GethWnd(), &upleft);
|
||||
curr = dxw.SubCoordinates(curr, upleft);
|
||||
}
|
||||
curr=dxw.FixCursorPos(curr); //v2.02.30
|
||||
lparam = MAKELPARAM(curr.x, curr.y);
|
||||
OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
|
||||
}
|
||||
GetHookInfo()->CursorX=LOWORD(lparam);
|
||||
GetHookInfo()->CursorY=HIWORD(lparam);
|
||||
}
|
||||
break;
|
||||
case WM_SETFOCUS:
|
||||
OutTraceDW("WindowProc: hwnd=%x GOT FOCUS\n", hwnd);
|
||||
if (dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion);
|
||||
break;
|
||||
case WM_KILLFOCUS:
|
||||
OutTraceDW("WindowProc: hwnd=%x LOST FOCUS\n", hwnd);
|
||||
if (dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor();
|
||||
if (dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL);
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
// Beware: closing main window does not always mean that the program is about to terminate!!!
|
||||
extern void gShowHideTaskBar(BOOL);
|
||||
if(dxw.dwFlags6 & CONFIRMONCLOSE){
|
||||
OutTraceDW("WindowProc: WM_CLOSE - terminating process?\n");
|
||||
if (MessageBoxA(NULL, "Do you really want to exit the game?", "DxWnd", MB_YESNO | MB_TASKMODAL) != IDYES) return FALSE;
|
||||
}
|
||||
if(dxw.dwFlags6 & HIDETASKBAR) gShowHideTaskBar(FALSE);
|
||||
if(dxw.dwFlags3 & FORCE16BPP) RecoverScreenMode();
|
||||
if(dxw.dwFlags6 & TERMINATEONCLOSE) TerminateProcess(GetCurrentProcess(),0);
|
||||
break;
|
||||
case WM_SYSKEYDOWN:
|
||||
case WM_KEYDOWN:
|
||||
if(!(dxw.dwFlags4 & ENABLEHOTKEYS)) break;
|
||||
OutTraceW("event %s wparam=%x lparam=%x\n", (message==WM_SYSKEYDOWN)?"WM_SYSKEYDOWN":"WM_KEYDOWN", wparam, lparam);
|
||||
UINT DxWndKey;
|
||||
DxWndKey=dxw.MapKeysConfig(message, lparam, wparam);
|
||||
switch (DxWndKey){
|
||||
case DXVK_CLIPTOGGLE:
|
||||
if(dxw.dwFlags1 & CLIPCURSOR){
|
||||
OutTraceDW("WindowProc: WM_SYSKEYDOWN key=%x ToggleState=%x\n",wparam,ClipCursorToggleState);
|
||||
ClipCursorToggleState = !ClipCursorToggleState;
|
||||
ClipCursorToggleState ? dxw.SetClipCursor() : dxw.EraseClipCursor();
|
||||
}
|
||||
break;
|
||||
case DXVK_REFRESH:
|
||||
dxw.ScreenRefresh();
|
||||
break;
|
||||
case DXVK_LOGTOGGLE:
|
||||
dx_ToggleLogging();
|
||||
break;
|
||||
case DXVK_PLOCKTOGGLE:
|
||||
dx_TogglePositionLock(hwnd);
|
||||
break;
|
||||
case DXVK_FPSTOGGLE:
|
||||
dx_ToggleFPS();
|
||||
break;
|
||||
case DXVK_CORNERIZE:
|
||||
dx_Cornerize(hwnd);
|
||||
break;
|
||||
case DXVK_TIMEFAST:
|
||||
case DXVK_TIMESLOW:
|
||||
if (dxw.dwFlags2 & TIMESTRETCH) {
|
||||
if (DxWndKey == DXVK_TIMESLOW && (dxw.TimeShift < 8)) dxw.TimeShift++;
|
||||
if (DxWndKey == DXVK_TIMEFAST && (dxw.TimeShift > -8)) dxw.TimeShift--;
|
||||
GetHookInfo()->TimeShift=dxw.TimeShift;
|
||||
OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption());
|
||||
}
|
||||
break;
|
||||
case DXVK_TIMETOGGLE:
|
||||
if (dxw.dwFlags2 & TIMESTRETCH) {
|
||||
if(TimeShiftToggle){
|
||||
SaveTimeShift=dxw.TimeShift;
|
||||
dxw.TimeShift=0;
|
||||
}
|
||||
else{
|
||||
dxw.TimeShift=SaveTimeShift;
|
||||
}
|
||||
TimeShiftToggle = !TimeShiftToggle;
|
||||
GetHookInfo()->TimeShift=dxw.TimeShift;
|
||||
}
|
||||
break;
|
||||
case DXVK_ALTF4:
|
||||
if (dxw.dwFlags1 & HANDLEALTF4) {
|
||||
OutTraceDW("WindowProc: WM_SYSKEYDOWN(ALT-F4) - terminating process\n");
|
||||
TerminateProcess(GetCurrentProcess(),0);
|
||||
}
|
||||
break;
|
||||
case DXVK_PRINTSCREEN:
|
||||
DDrawScreenShot();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (dxw.dwFlags1 & AUTOREFRESH) dxw.ScreenRefresh();
|
||||
|
||||
pWindowProc=dxwws.GetProc(hwnd);
|
||||
//OutTraceB("WindowProc: pWindowProc=%x extWindowProc=%x message=%x(%s) wparam=%x lparam=%x\n",
|
||||
// (*pWindowProc), extWindowProc, message, ExplainWinMessage(message), wparam, lparam);
|
||||
if(pWindowProc) {
|
||||
LRESULT ret;
|
||||
|
||||
// v2.02.36: use CallWindowProc that handles WinProc handles
|
||||
ret=(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam);
|
||||
|
||||
// save last NCHITTEST cursor position for use with KEEPASPECTRATIO scaling
|
||||
if(message==WM_NCHITTEST) LastCursorPos=ret;
|
||||
// v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages
|
||||
if(dxw.dwFlags2 & FORCEWINRESIZE){
|
||||
switch(message){
|
||||
//case WM_NCHITTEST:
|
||||
//case WM_NCPAINT:
|
||||
//case WM_NCMOUSEMOVE:
|
||||
//case WM_NCCALCSIZE:
|
||||
//case WM_NCACTIVATE:
|
||||
case WM_SETCURSOR: // shows a different cursor when moving on borders
|
||||
case WM_NCLBUTTONDOWN: // intercepts mouse down on borders
|
||||
case WM_NCLBUTTONUP: // intercepts mouse up on borders
|
||||
ret=(*pDefWindowProcA)(hwnd, message, wparam, lparam);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//OutTraceDW("ASSERT: WindowProc mismatch hwnd=%x\n", hwnd);
|
||||
// ??? maybe it's a normal condition, whenever you don't have a WindowProc routine
|
||||
// like in Commandos 2. Flag it?
|
||||
char sMsg[81];
|
||||
sprintf(sMsg,"ASSERT: WindowProc mismatch hwnd=%x\n", hwnd);
|
||||
OutTraceDW(sMsg);
|
||||
if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION);
|
||||
return (*pDefWindowProcA)(hwnd, message, wparam, lparam);
|
||||
}
|
@ -39,6 +39,7 @@ void CTabDebug::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_Check(pDX, IDC_ANALYTICMODE, cTarget->m_AnalyticMode);
|
||||
DDX_Check(pDX, IDC_SURFACEWARN, cTarget->m_SurfaceWarn);
|
||||
DDX_Check(pDX, IDC_CAPMASK, cTarget->m_CapMask);
|
||||
DDX_Check(pDX, IDC_NOWINDOWHOOKS, cTarget->m_NoWindowHooks);
|
||||
DDX_Check(pDX, IDC_NODDRAWBLT, cTarget->m_NoDDRAWBlt);
|
||||
DDX_Check(pDX, IDC_NODDRAWFLIP, cTarget->m_NoDDRAWFlip);
|
||||
DDX_Check(pDX, IDC_NOGDIBLT, cTarget->m_NoGDIBlt);
|
||||
|
@ -36,10 +36,11 @@ void CTabInput::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_Check(pDX, IDC_KEEPCURSORWITHIN, cTarget->m_KeepCursorWithin);
|
||||
DDX_Check(pDX, IDC_KEEPCURSORFIXED, cTarget->m_KeepCursorFixed);
|
||||
DDX_Check(pDX, IDC_MESSAGEPROC, cTarget->m_MessageProc);
|
||||
//DDX_Check(pDX, IDC_NOMOUSEPROC, cTarget->m_NoMouseProc);
|
||||
DDX_Check(pDX, IDC_FIXNCHITTEST, cTarget->m_FixNCHITTEST);
|
||||
DDX_Check(pDX, IDC_SLOW, cTarget->m_SlowDown);
|
||||
DDX_Check(pDX, IDC_RELEASEMOUSE, cTarget->m_ReleaseMouse);
|
||||
DDX_Check(pDX, IDC_FRAMECOMPENSATION, cTarget->m_FrameCompensation);
|
||||
//DDX_Check(pDX, IDC_FRAMECOMPENSATION, cTarget->m_FrameCompensation);
|
||||
// DirectInput
|
||||
DDX_Check(pDX, IDC_HOOKDI, cTarget->m_HookDI);
|
||||
DDX_Text(pDX, IDC_INITX, cTarget->m_InitX);
|
||||
|
@ -159,6 +159,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_Force16BPP = FALSE;
|
||||
m_HookChildWin = FALSE;
|
||||
m_MessageProc = FALSE;
|
||||
//m_NoMouseProc = FALSE;
|
||||
m_FixNCHITTEST = FALSE;
|
||||
m_RecoverScreenMode = FALSE;
|
||||
m_RefreshOnResize = FALSE;
|
||||
@ -177,7 +178,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_QuarterBlt = FALSE;
|
||||
m_FineTiming = FALSE;
|
||||
m_ReleaseMouse = FALSE;
|
||||
m_FrameCompensation = FALSE;
|
||||
//m_FrameCompensation = FALSE;
|
||||
m_EnableHotKeys = TRUE; // default true !!
|
||||
m_InterceptRDTSC = FALSE;
|
||||
m_HookOpenGL = FALSE;
|
||||
@ -189,6 +190,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_Deinterlace = FALSE;
|
||||
m_SurfaceWarn = FALSE;
|
||||
m_CapMask = FALSE;
|
||||
m_NoWindowHooks = FALSE;
|
||||
m_NoDDRAWBlt = FALSE;
|
||||
m_NoDDRAWFlip = FALSE;
|
||||
m_NoGDIBlt = FALSE;
|
||||
|
@ -124,6 +124,7 @@ public:
|
||||
BOOL m_NoWindowMove;
|
||||
BOOL m_HookChildWin;
|
||||
BOOL m_MessageProc;
|
||||
//BOOL m_NoMouseProc;
|
||||
BOOL m_FixNCHITTEST;
|
||||
BOOL m_RecoverScreenMode;
|
||||
BOOL m_RefreshOnResize;
|
||||
@ -143,7 +144,7 @@ public:
|
||||
BOOL m_QuarterBlt;
|
||||
BOOL m_FineTiming;
|
||||
BOOL m_ReleaseMouse;
|
||||
BOOL m_FrameCompensation;
|
||||
// BOOL m_FrameCompensation;
|
||||
BOOL m_EnableHotKeys;
|
||||
BOOL m_InterceptRDTSC;
|
||||
BOOL m_HookOpenGL;
|
||||
@ -155,6 +156,7 @@ public:
|
||||
BOOL m_Deinterlace;
|
||||
BOOL m_SurfaceWarn;
|
||||
BOOL m_CapMask;
|
||||
BOOL m_NoWindowHooks;
|
||||
BOOL m_NoDDRAWBlt;
|
||||
BOOL m_NoDDRAWFlip;
|
||||
BOOL m_NoGDIBlt;
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -359,6 +359,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_Force16BPP) t->flags3 |= FORCE16BPP;
|
||||
if(dlg->m_HookChildWin) t->flags |= HOOKCHILDWIN;
|
||||
if(dlg->m_MessageProc) t->flags |= MESSAGEPROC;
|
||||
//if(dlg->m_NoMouseProc) t->flags6 |= NOMOUSEPROC;
|
||||
if(dlg->m_FixNCHITTEST) t->flags2 |= FIXNCHITTEST;
|
||||
if(dlg->m_RecoverScreenMode) t->flags2 |= RECOVERSCREENMODE;
|
||||
if(dlg->m_RefreshOnResize) t->flags2 |= REFRESHONRESIZE;
|
||||
@ -377,7 +378,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_QuarterBlt) t->flags5 |= QUARTERBLT;
|
||||
if(dlg->m_FineTiming) t->flags4 |= FINETIMING;
|
||||
if(dlg->m_ReleaseMouse) t->flags4 |= RELEASEMOUSE;
|
||||
if(dlg->m_FrameCompensation) t->flags4 |= FRAMECOMPENSATION;
|
||||
// if(dlg->m_FrameCompensation) t->flags4 |= FRAMECOMPENSATION;
|
||||
if(dlg->m_EnableHotKeys) t->flags4 |= ENABLEHOTKEYS;
|
||||
if(dlg->m_InterceptRDTSC) t->flags4 |= INTERCEPTRDTSC;
|
||||
if(dlg->m_HookOpenGL) t->flags2 |= HOOKOPENGL;
|
||||
@ -393,6 +394,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
if(dlg->m_NoPaletteUpdate) t->flags2 |= NOPALETTEUPDATE;
|
||||
if(dlg->m_SurfaceWarn) t->flags3 |= SURFACEWARN;
|
||||
if(dlg->m_CapMask) t->flags3 |= CAPMASK;
|
||||
if(dlg->m_NoWindowHooks) t->flags6 |= NOWINDOWHOOKS;
|
||||
if(dlg->m_NoDDRAWBlt) t->flags3 |= NODDRAWBLT;
|
||||
if(dlg->m_NoDDRAWFlip) t->flags3 |= NODDRAWFLIP;
|
||||
if(dlg->m_NoGDIBlt) t->flags3 |= NOGDIBLT;
|
||||
@ -597,6 +599,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
dlg->m_Force16BPP = t->flags3 & FORCE16BPP ? 1 : 0;
|
||||
dlg->m_HookChildWin = t->flags & HOOKCHILDWIN ? 1 : 0;
|
||||
dlg->m_MessageProc = t->flags & MESSAGEPROC ? 1 : 0;
|
||||
//dlg->m_NoMouseProc = t->flags6 & NOMOUSEPROC ? 1 : 0;
|
||||
dlg->m_FixNCHITTEST = t->flags2 & FIXNCHITTEST ? 1 : 0;
|
||||
dlg->m_RecoverScreenMode = t->flags2 & RECOVERSCREENMODE ? 1 : 0;
|
||||
dlg->m_RefreshOnResize = t->flags2 & REFRESHONRESIZE ? 1 : 0;
|
||||
@ -615,7 +618,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
dlg->m_QuarterBlt = t->flags5 & QUARTERBLT ? 1 : 0;
|
||||
dlg->m_FineTiming = t->flags4 & FINETIMING ? 1 : 0;
|
||||
dlg->m_ReleaseMouse = t->flags4 & RELEASEMOUSE ? 1 : 0;
|
||||
dlg->m_FrameCompensation = t->flags4 & FRAMECOMPENSATION ? 1 : 0;
|
||||
// dlg->m_FrameCompensation = t->flags4 & FRAMECOMPENSATION ? 1 : 0;
|
||||
dlg->m_EnableHotKeys = t->flags4 & ENABLEHOTKEYS ? 1 : 0;
|
||||
dlg->m_InterceptRDTSC = t->flags4 & INTERCEPTRDTSC ? 1 : 0;
|
||||
dlg->m_HookOpenGL = t->flags2 & HOOKOPENGL ? 1 : 0;
|
||||
@ -631,6 +634,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
dlg->m_NoPaletteUpdate = t->flags2 & NOPALETTEUPDATE ? 1 : 0;
|
||||
dlg->m_SurfaceWarn = t->flags3 & SURFACEWARN ? 1 : 0;
|
||||
dlg->m_CapMask = t->flags3 & CAPMASK ? 1 : 0;
|
||||
dlg->m_NoWindowHooks = t->flags6 & NOWINDOWHOOKS ? 1 : 0;
|
||||
dlg->m_NoDDRAWBlt = t->flags3 & NODDRAWBLT ? 1 : 0;
|
||||
dlg->m_NoDDRAWFlip = t->flags3 & NODDRAWFLIP ? 1 : 0;
|
||||
dlg->m_NoGDIBlt = t->flags3 & NOGDIBLT ? 1 : 0;
|
||||
|
BIN
host/resource
BIN
host/resource
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user