diff --git a/Include/dxwnd.h b/Include/dxwnd.h
index 0775a0a..c1d4cec 100644
--- a/Include/dxwnd.h
+++ b/Include/dxwnd.h
@@ -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
diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index 10d7108..164a363 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:42ec28df67eae0d8fd18218010fd1cf3ad9c182d0b3ee9d828c1d11c925c96e0
+oid sha256:d724989d76de31cdefc98848587998e2e3464ea49793397892e068d37db2c730
size 593408
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index 6d94862..a960b3c 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:945f3a67534c63ae2e17d0cb76db3a473149e39b62164fb433f6a4a021d75471
+oid sha256:17c20de2bcab09a41568811d8227ff38f2411dd95c133e1252e2852293ab643f
size 545280
diff --git a/build/dxwnd_manual.pdf b/build/dxwnd_manual.pdf
deleted file mode 100644
index 4b87ac7..0000000
Binary files a/build/dxwnd_manual.pdf and /dev/null differ
diff --git a/build/exports/688(I) Hunter Killer.dxw b/build/exports/688(I) Hunter Killer.dxw
new file mode 100644
index 0000000..2a4f44d
--- /dev/null
+++ b/build/exports/688(I) Hunter Killer.dxw
@@ -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
diff --git a/build/exports/Batman Vengeance.dxw b/build/exports/Batman Vengeance.dxw
new file mode 100644
index 0000000..0d86092
--- /dev/null
+++ b/build/exports/Batman Vengeance.dxw
@@ -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
diff --git a/build/exports/Cool Pool Eightball Demo.dxw b/build/exports/Cool Pool Eightball Demo.dxw
new file mode 100644
index 0000000..a606c6b
--- /dev/null
+++ b/build/exports/Cool Pool Eightball Demo.dxw
@@ -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
diff --git a/build/exports/Deathtrap Dungeon.dxw b/build/exports/Deathtrap Dungeon.dxw
new file mode 100644
index 0000000..a01e8c7
--- /dev/null
+++ b/build/exports/Deathtrap Dungeon.dxw
@@ -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
diff --git a/build/exports/Dweep Gold.dxw b/build/exports/Dweep Gold.dxw
new file mode 100644
index 0000000..809d4e1
--- /dev/null
+++ b/build/exports/Dweep Gold.dxw
@@ -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
diff --git a/build/exports/Fin-Fin.dxw b/build/exports/Fin-Fin.dxw
new file mode 100644
index 0000000..321cc05
--- /dev/null
+++ b/build/exports/Fin-Fin.dxw
@@ -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
diff --git a/build/exports/Microsoft Midtown Madness.dxw b/build/exports/Microsoft Midtown Madness.dxw
index 2502ca3..f026895 100644
--- a/build/exports/Microsoft Midtown Madness.dxw
+++ b/build/exports/Microsoft Midtown Madness.dxw
@@ -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=
diff --git a/build/exports/PBA Bowling 2 Demo.dxw b/build/exports/PBA Bowling 2 Demo.dxw
new file mode 100644
index 0000000..d87e0a6
--- /dev/null
+++ b/build/exports/PBA Bowling 2 Demo.dxw
@@ -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
diff --git a/build/exports/Requiem Avenging Angel (D3D).dxw b/build/exports/Requiem Avenging Angel (D3D).dxw
index 7a7d73a..70810f6 100644
--- a/build/exports/Requiem Avenging Angel (D3D).dxw
+++ b/build/exports/Requiem Avenging Angel (D3D).dxw
@@ -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
diff --git a/build/exports/Requiem Avenging Angel (software).dxw b/build/exports/Requiem Avenging Angel (software).dxw
index 0b0b99a..bc7af93 100644
--- a/build/exports/Requiem Avenging Angel (software).dxw
+++ b/build/exports/Requiem Avenging Angel (software).dxw
@@ -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
diff --git a/build/exports/Sid Meyer's Gettysburg Demo.dxw b/build/exports/Sid Meyer's Gettysburg Demo.dxw
new file mode 100644
index 0000000..626229a
--- /dev/null
+++ b/build/exports/Sid Meyer's Gettysburg Demo.dxw
@@ -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
diff --git a/build/exports/Warlords 3.dxw b/build/exports/Warlords 3.dxw
index ed24623..0780675 100644
--- a/build/exports/Warlords 3.dxw
+++ b/build/exports/Warlords 3.dxw
@@ -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
diff --git a/build/exports/X-Files, the.dxw b/build/exports/X-Files, the.dxw
new file mode 100644
index 0000000..0d19694
--- /dev/null
+++ b/build/exports/X-Files, the.dxw
@@ -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
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index af922bb..dee4007 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -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
\ No newline at end of file
+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
diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp
index cea0f48..fb390c1 100644
--- a/dll/ddblit.cpp
+++ b/dll/ddblit.cpp
@@ -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);
diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp
index 7f20674..560e7f9 100644
--- a/dll/ddraw.cpp
+++ b/dll/ddraw.cpp
@@ -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;
diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp
index a9207ab..b45ff20 100644
--- a/dll/dxhook.cpp
+++ b/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;
diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp
index 1e0f83a..871c000 100644
--- a/dll/dxwcore.cpp
+++ b/dll/dxwcore.cpp
@@ -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:
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index 3c7f557..dcbf3a9 100644
--- a/dll/dxwnd.cpp
+++ b/dll/dxwnd.cpp
@@ -27,7 +27,7 @@ along with this program. If not, see .
#include "TlHelp32.h"
-#define VERSION "2.03.40"
+#define VERSION "2.03.41"
#define DDTHREADLOCK 1
//#define LOCKTHREADS
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index 4383b91..f07b3d7 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj
index 02498cd..c95764e 100644
--- a/dll/dxwnd.vs2008.vcproj
+++ b/dll/dxwnd.vs2008.vcproj
@@ -445,6 +445,10 @@
RelativePath=".\kernel32.cpp"
>
+
+
@@ -469,6 +473,10 @@
RelativePath=".\winmm.cpp"
>
+
+
diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp
index 3982e0c..13f2c62 100644
--- a/dll/gdi32.cpp
+++ b/dll/gdi32.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)
{
diff --git a/dll/msghook.cpp b/dll/msghook.cpp
new file mode 100644
index 0000000..183b53a
--- /dev/null
+++ b/dll/msghook.cpp
@@ -0,0 +1,64 @@
+#define _WIN32_WINNT 0x0600
+#define WIN32_LEAN_AND_MEAN
+#define _CRT_SECURE_NO_DEPRECATE 1
+
+#include
+#include
+#include
+#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);
+}
diff --git a/dll/user32.cpp b/dll/user32.cpp
index 2c0771e..a13b3f0 100644
--- a/dll/user32.cpp
+++ b/dll/user32.cpp
@@ -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;
diff --git a/dll/winproc.cpp b/dll/winproc.cpp
new file mode 100644
index 0000000..7d3fbfc
--- /dev/null
+++ b/dll/winproc.cpp
@@ -0,0 +1,591 @@
+#define _WIN32_WINNT 0x0600
+#define WIN32_LEAN_AND_MEAN
+#define _CRT_SECURE_NO_DEPRECATE 1
+
+#include
+#include
+#include
+#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);
+}
\ No newline at end of file
diff --git a/host/TabDebug.cpp b/host/TabDebug.cpp
index 01cd07a..ce167b3 100644
--- a/host/TabDebug.cpp
+++ b/host/TabDebug.cpp
@@ -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);
diff --git a/host/TabInput.cpp b/host/TabInput.cpp
index 04d10a0..f2abdab 100644
--- a/host/TabInput.cpp
+++ b/host/TabInput.cpp
@@ -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);
diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp
index 1cda14f..36738f6 100644
--- a/host/TargetDlg.cpp
+++ b/host/TargetDlg.cpp
@@ -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;
diff --git a/host/TargetDlg.h b/host/TargetDlg.h
index 2cd461d..3180262 100644
--- a/host/TargetDlg.h
+++ b/host/TargetDlg.h
@@ -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;
diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps
index c3ec7c7..732034a 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index 47116eb..e3edc1d 100644
Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index c406242..4d106bb 100644
Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ
diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp
index e2c4846..bad4c01 100644
--- a/host/dxwndhostView.cpp
+++ b/host/dxwndhostView.cpp
@@ -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;
diff --git a/host/resource b/host/resource
index a6c374b..4aed585 100644
Binary files a/host/resource and b/host/resource differ