From 9efa398c81a50b14ed9d05061c617b05a28cb557 Mon Sep 17 00:00:00 2001 From: gho tik Date: Tue, 22 Apr 2014 12:39:07 -0400 Subject: [PATCH] v2_02_71_src Former-commit-id: 756c3d65da958109a5a35683973512b469ed8b20 --- Include/dxwnd.h | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- .../Close Combat 5 Invasion Normandy.dxw | 26 ++ build/exports/Dune 2000.dxw | 27 ++ .../exports/Microsotf Motocross Madness 2.dxw | 4 +- build/exports/dxwnd.ini | 4 +- build/readme-relnotes.txt | 7 + dll/ddraw.cpp | 2 +- dll/dwhide.cpp | 16 +- dll/dxhook.cpp | 25 +- dll/dxwcore.cpp | 101 +++-- dll/dxwcore.hpp | 2 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 276480 -> 288768 bytes dll/gdi32.cpp | 123 ++---- dll/hd3d7.cpp | 3 +- dll/syslibs.h | 21 +- dll/user32.cpp | 412 +++++++++++------- host/Resource.h | 12 +- host/{TabMouse.cpp => TabInput.cpp} | 8 +- host/{TabMouse.h => TabInput.h} | 0 host/TabProgram.cpp | 18 +- host/TabProgram.h | 1 + host/TabWindow.cpp | 1 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 3 + host/dxTabCtrl.cpp | 2 +- host/dxwndhost.aps | Bin 171668 -> 172140 bytes host/dxwndhost.h | 1 + host/dxwndhost.rc | 41 +- host/dxwndhost.vs2008.suo | Bin 132608 -> 140800 bytes host/dxwndhost.vs2008.vcproj | 8 +- host/dxwndhostView.cpp | 39 +- 34 files changed, 554 insertions(+), 365 deletions(-) create mode 100644 build/exports/Close Combat 5 Invasion Normandy.dxw create mode 100644 build/exports/Dune 2000.dxw rename host/{TabMouse.cpp => TabInput.cpp} (86%) rename host/{TabMouse.h => TabInput.h} (100%) diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 79c34d6..cee3fd1 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -137,6 +137,7 @@ #define NATIVERES 0x00200000 // Supports hardware native resolutions (depending on your PC) #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 // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index adccf07..3eacf8a 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:08566b33e7a85d73883a1dedcb52c0be7fdb04f0e8cb8d6a44acd5404c8b2721 -size 471040 +oid sha256:dd0cab2c1de012cafee122274a0f9f62529e667e5348f1d32f1a8a181339b3e7 +size 473600 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index f1b4d84..673540f 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bdc5c58a5fba8b5b8013c2a5fdecfe9ba5fd024b73be5855891c120573a35f5b -size 537600 +oid sha256:82bfb64a3a58d26ffe21d8e615fb147cb29a86875c3260cdd3fcbed9875b770c +size 539136 diff --git a/build/exports/Close Combat 5 Invasion Normandy.dxw b/build/exports/Close Combat 5 Invasion Normandy.dxw new file mode 100644 index 0000000..a34522b --- /dev/null +++ b/build/exports/Close Combat 5 Invasion Normandy.dxw @@ -0,0 +1,26 @@ +[target] +title0=Close Combat 5 Invasion Normandy +path0=D:\Games\Close Combat 5\CC5.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134218272 +flagg0=1744830464 +flagh0=20 +flagi0=4194308 +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 diff --git a/build/exports/Dune 2000.dxw b/build/exports/Dune 2000.dxw new file mode 100644 index 0000000..83abcdc --- /dev/null +++ b/build/exports/Dune 2000.dxw @@ -0,0 +1,27 @@ +[target] +title0=Dune 2000 +path0=D:\Games\Dune 2000\DUNE2000.DAT +launchpath0=D:\Games\Dune 2000\DUNE2000.EXE +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=671105312 +flagg0=1207959568 +flagh0=20 +flagi0=4194308 +tflag0=64 +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 diff --git a/build/exports/Microsotf Motocross Madness 2.dxw b/build/exports/Microsotf Motocross Madness 2.dxw index 30a99b7..651497a 100644 --- a/build/exports/Microsotf Motocross Madness 2.dxw +++ b/build/exports/Microsotf Motocross Madness 2.dxw @@ -5,8 +5,8 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134217760 -flagg0=1207959552 +flag0=134234144 +flagg0=1207959808 flagh0=20 flagi0=4194308 tflag0=64 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index 0d20e4d..e030d80 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1386 -posy=352 +posx=1260 +posy=439 sizx=320 sizy=200 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index eb43cee..d63a843 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -460,3 +460,10 @@ fix: corrected child window procedure handling - fixes "Imperialism" child windo fixed FillRect coordinate handling - fixes "Imperialism" menus fixed SetWindowPlacement handling +v2.02.71 +fix: Set/GetWindowLongA/W are always hooked. +fix: added user32 GetDCEx hook for GDI Emulation & Directraw mode +fix: hooked "FrameRect", "TabbedTextOutA", "DrawTextA", "DrawTextExA", "FillRect" in scaled mode only +fix: FIXNCHITTEST mode +fix: when main win is closed, blit area is made null to avoid messing with a wrong screen area +added "Release mouse outside window" option. This option causes the get cursor position to detect a centered mouse position when the cursor is moved outside the window, allowing interaction with other windows without scrolling ot the windowed program. Mainly, this option is meant to help people with a physical disability to use other programs (e. g. the virtual keyboard) to play games. diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 25afba5..c2c1d6b 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -3851,7 +3851,7 @@ HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) IsPrim=dxw.IsAPrimarySurface(lpdds); OutTraceDDRAW("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc); - res=(*pReleaseDC)(lpdds,hdc); + res=(*pReleaseDC)(lpdds, hdc); if((IsPrim) && (dxw.dwFlags1 & EMULATESURFACE)) sBlt("ReleaseDC", lpdds, NULL, lpdds, NULL, 0, NULL, FALSE); if (res) OutTraceE("ReleaseDC: ERROR res=%x(%s)\n", res, ExplainDDError(res)); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; diff --git a/dll/dwhide.cpp b/dll/dwhide.cpp index ab1c522..93438e4 100644 --- a/dll/dwhide.cpp +++ b/dll/dwhide.cpp @@ -91,19 +91,19 @@ void dxwCore::HideDesktop(HWND hwnd) HWND hParent = (*pGetDesktopWindow)(); if(!wleft) { wleft=(*pCreateWindowExA)(0, "dxwnd:hider", "hider", 0, 0, 0, 0, 0, hParent, NULL, hinst, NULL); - (*pSetWindowLong)(wleft, GWL_STYLE, 0); + (*pSetWindowLongA)(wleft, GWL_STYLE, 0); } if(!wright) { wright=(*pCreateWindowExA)(0, "dxwnd:hider", "hider", 0, 0, 0, 0, 0, hParent, NULL, hinst, NULL); - (*pSetWindowLong)(wright, GWL_STYLE, 0); + (*pSetWindowLongA)(wright, GWL_STYLE, 0); } if(!wtop) { wtop=(*pCreateWindowExA)(0, "dxwnd:hider", "hider", 0, 0, 0, 0, 0, hParent, NULL, hinst, NULL); - (*pSetWindowLong)(wtop, GWL_STYLE, 0); + (*pSetWindowLongA)(wtop, GWL_STYLE, 0); } if(!wbottom) { wbottom=(*pCreateWindowExA)(0, "dxwnd:hider", "hider", 0, 0, 0, 0, 0, hParent, NULL, hinst, NULL); - (*pSetWindowLong)(wbottom, GWL_STYLE, 0); + (*pSetWindowLongA)(wbottom, GWL_STYLE, 0); } (*pMoveWindow)(wleft, wDesktop.left, wDesktop.top, wRect.left, wDesktop.bottom, TRUE); @@ -111,10 +111,10 @@ void dxwCore::HideDesktop(HWND hwnd) (*pMoveWindow)(wtop, wDesktop.left, wDesktop.top, wDesktop.right, wRect.top-wDesktop.top, TRUE); (*pMoveWindow)(wbottom, wDesktop.left, wRect.bottom, wDesktop.right, wDesktop.bottom-wRect.bottom, TRUE); - (*pSetWindowLong)(wleft, GWL_EXSTYLE, WS_EX_TOPMOST); - (*pSetWindowLong)(wright, GWL_EXSTYLE, WS_EX_TOPMOST); - (*pSetWindowLong)(wtop, GWL_EXSTYLE, WS_EX_TOPMOST); - (*pSetWindowLong)(wbottom, GWL_EXSTYLE, WS_EX_TOPMOST); + (*pSetWindowLongA)(wleft, GWL_EXSTYLE, WS_EX_TOPMOST); + (*pSetWindowLongA)(wright, GWL_EXSTYLE, WS_EX_TOPMOST); + (*pSetWindowLongA)(wtop, GWL_EXSTYLE, WS_EX_TOPMOST); + (*pSetWindowLongA)(wbottom, GWL_EXSTYLE, WS_EX_TOPMOST); (*pShowWindow)(wleft, SW_SHOW); (*pShowWindow)(wright, SW_SHOW); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 1f57186..2acf486 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -84,7 +84,7 @@ static char *Flag4Names[32]={ "LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP", "STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF", "FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV", - "", "", "", "", + "RELEASEMOUSE", "", "", "", "", "", "", "", }; @@ -505,8 +505,8 @@ void CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWPOS wp) RECT UnmappedRect; UnmappedRect=rect; - dwStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLong)(hwnd, GWL_EXSTYLE); + dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); + dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); // BEWARE: from MSDN - If the window is a child window, the return value is undefined. hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd); AdjustWindowRectEx(&rect, dwStyle, (hMenu!=NULL), dwExStyle); @@ -562,7 +562,7 @@ void AdjustWindowPos(HWND hwnd, DWORD width, DWORD height) void HookWindowProc(HWND hwnd) { WNDPROC pWindowProc; - pWindowProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC); + pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); if ((pWindowProc == extWindowProc) || (pWindowProc == extChildWindowProc) || (pWindowProc == extDialogWindowProc)){ @@ -572,7 +572,7 @@ void HookWindowProc(HWND hwnd) else {// don't hook twice .... long lres; WhndStackPush(hwnd, pWindowProc); - lres=(*pSetWindowLong)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); + lres=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); OutTraceDW("SetWindowLong: hwnd=%x HOOK WindowProc=%x->%x\n", hwnd, lres, (LONG)extWindowProc); } } @@ -599,8 +599,8 @@ void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height) break; } - (*pSetWindowLong)(hwnd, GWL_STYLE, style); - (*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0); + (*pSetWindowLongA)(hwnd, GWL_STYLE, style); + (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0); (*pShowWindow)(hwnd, SW_SHOWNORMAL); OutTraceDW("AdjustWindowFrame hwnd=%x, set style=%s extstyle=0\n", hwnd, (style == 0) ? "0" : "WS_OVERLAPPEDWINDOW"); AdjustWindowPos(hwnd, width, height); @@ -978,11 +978,12 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp if (dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor(); if (dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL); break; - case WM_CLOSE: - OutTraceDW("WindowProc: WM_CLOSE - terminating process\n"); - if(dxw.dwFlags3 & FORCE16BPP) RecoverScreenMode(); - TerminateProcess(GetCurrentProcess(),0); - break; + // commented out: WM_CLOSE just issue a request to close the window, not the process! It should be WM_QUIT.... + //case WM_CLOSE: + // OutTraceDW("WindowProc: WM_CLOSE - terminating process\n"); + // if(dxw.dwFlags3 & FORCE16BPP) RecoverScreenMode(); + // TerminateProcess(GetCurrentProcess(),0); + // break; case WM_SYSKEYDOWN: OutTraceW("event WM_SYSKEYDOWN wparam=%x lparam=%x\n", wparam, lparam); switch (wparam){ diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 7ef298b..9acf59d 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -362,10 +362,21 @@ POINT dxwCore::FixCursorPos(POINT prev) } } - if (curr.x < 0) curr.x = 0; - if (curr.y < 0) curr.y = 0; - if (curr.x > w) curr.x = w; - if (curr.y > h) curr.y = h; + if(dxw.dwFlags4 & RELEASEMOUSE){ + 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.x = 0; + if (curr.y < 0) curr.y = 0; + if (curr.x > w) curr.x = w; + if (curr.y > h) curr.y = h; + } if (w) curr.x = (curr.x * dxw.GetScreenWidth()) / w; if (h) curr.y = (curr.y * dxw.GetScreenHeight()) / h; @@ -511,10 +522,9 @@ RECT dxwCore::MapWindowRect(LPRECT lpRect) if (!(*pGetClientRect)(hWnd, &ClientRect)){ OutTraceE("GetClientRect ERROR: err=%d hwnd=%x at %d\n", GetLastError(), hWnd, __LINE__); - // v2.02.31: try.... - ClientRect.top=ClientRect.left=0; - ClientRect.right=iRatioX; - ClientRect.bottom=iRatioY; + // v2.02.71: return a void area to prevent blitting to wrong area + ClientRect.top=ClientRect.left=ClientRect.right=ClientRect.bottom=0; + return ClientRect; } RetRect=ClientRect; @@ -770,6 +780,16 @@ POINT dxwCore::AddCoordinates(POINT p1, POINT p2) return ps; } +RECT dxwCore::AddCoordinates(RECT r1, POINT p2) +{ + RECT rs; + rs.left = r1.left + p2.x; + rs.right = r1.right + p2.x; + rs.top = r1.top + p2.y; + rs.bottom = r1.bottom + p2.y; + return rs; +} + POINT dxwCore::SubCoordinates(POINT p1, POINT p2) { POINT ps; @@ -1328,7 +1348,7 @@ void dxwCore::FixWindowFrame(HWND hwnd) OutTraceDW("FixWindowFrame: hwnd=%x\n", hwnd); - nOldStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); + nOldStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); if (!nOldStyle){ OutTraceE("FixWindowFrame: GetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); return; @@ -1337,12 +1357,12 @@ void dxwCore::FixWindowFrame(HWND hwnd) OutTraceDW("FixWindowFrame: style=%x(%s)\n",nOldStyle,ExplainStyle(nOldStyle)); // fix style - if (!(*pSetWindowLong)(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW)){ + if (!(*pSetWindowLongA)(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW)){ OutTraceE("FixWindowFrame: SetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); return; } // fix exstyle - if (!(*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0)){ + if (!(*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0)){ OutTraceE("FixWindowFrame: SetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); return; } @@ -1365,7 +1385,7 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) lpSS->styleNew= WS_OVERLAPPEDWINDOW; } if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value - lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_STYLE); + lpSS->styleNew= (*pGetWindowLongA)(hwnd, GWL_STYLE); } if (dxw.dwFlags1 & PREVENTMAXIMIZE){ // disable maximize settings if (lpSS->styleNew & WS_MAXIMIZE){ @@ -1381,7 +1401,7 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) lpSS->styleNew= 0; } if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value - lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_EXSTYLE); + lpSS->styleNew= (*pGetWindowLongA)(hwnd, GWL_EXSTYLE); } if ((dxw.dwFlags1 & PREVENTMAXIMIZE) && (hwnd==hWnd)){ // disable maximize settings if (lpSS->styleNew & WS_EX_TOPMOST){ @@ -1398,8 +1418,10 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) HDC dxwCore::AcquireEmulatedDC(HWND hwnd) { HDC wdc; - if(!(wdc=(*pGDIGetDC)(hwnd))) + if(!(wdc=(*pGDIGetDC)(hwnd))){ OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + return NULL; + } return AcquireEmulatedDC(wdc); } @@ -1416,25 +1438,32 @@ HDC dxwCore::AcquireEmulatedDC(LPDIRECTDRAWSURFACE lpdds) HDC dxwCore::AcquireEmulatedDC(HDC wdc) { RealHDC=wdc; - //HDC wdc; - //if(!(wdc=(*pGDIGetDC)(hwnd))) - //OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - if(!VirtualHDC){ // or resolution changed and you must rebuild a new one .... !!!!! - if(!(VirtualHDC=CreateCompatibleDC(wdc))) - OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - if(!VirtualPic){ - if(!(VirtualPic=CreateCompatibleBitmap(wdc, dxw.GetScreenWidth(), dxw.GetScreenHeight()))) - OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - } - if(!SelectObject(VirtualHDC, VirtualPic)){ - if(!DeleteObject(VirtualPic)) - OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - if(!(VirtualPic=CreateCompatibleBitmap(wdc, dxw.GetScreenWidth(), dxw.GetScreenHeight()))) - OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - if(!SelectObject(VirtualHDC, VirtualPic)) - OutTraceE("SelectObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - } + HWND hwnd; + RECT WinRect; + if(!(hwnd=WindowFromDC(wdc))) + OutTraceE("WindowFromDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + (*pGetClientRect)(hwnd, &WinRect); + if(dxw.IsDesktop(hwnd)){ + dxw.VirtualPicRect = dxw.GetScreenRect(); } + else { + VirtualPicRect = WinRect; + dxw.UnmapClient(&VirtualPicRect); + } + if(!(VirtualHDC=CreateCompatibleDC(wdc))) + OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + if(!(VirtualPic=CreateCompatibleBitmap(wdc, VirtualPicRect.right, VirtualPicRect.bottom))) + OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + if(!SelectObject(VirtualHDC, VirtualPic)){ + if(!DeleteObject(VirtualPic)) + OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + if(!(VirtualPic=CreateCompatibleBitmap(wdc, dxw.GetScreenWidth(), dxw.GetScreenHeight()))) + OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + if(!SelectObject(VirtualHDC, VirtualPic)) + OutTraceE("SelectObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + } + if(!(*pGDIStretchBlt)(VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, wdc, 0, 0, WinRect.right, WinRect.bottom, SRCCOPY)) + OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__); return VirtualHDC; } @@ -1446,10 +1475,14 @@ BOOL dxwCore::ReleaseEmulatedDC(HWND hwnd) (*pGetClientRect)(hwnd, &client); if(!(wdc=(*pGDIGetDC)(hwnd))) OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - //OutTrace("StretchBlt: destdc=%x destrect=(0,0)-(%d,%d) srcdc=%x srcrect=(0,0)-(%d,%d)\n", wdc, client.right, client.bottom, VirtualHDC, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - if(!(*pGDIStretchBlt)(wdc, 0, 0, client.right, client.bottom, VirtualHDC, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), SRCCOPY)) + //OutTrace("StretchBlt: destdc=%x destrect=(0,0)-(%d,%d) srcdc=%x srcrect=(0,0)-(%d,%d)\n", wdc, client.right, client.bottom, VirtualHDC, VirtualPicRect.right, VirtualPicRect.bottom); + if(!(*pGDIStretchBlt)(wdc, 0, 0, client.right, client.bottom, VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, SRCCOPY)) OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__); //(*pInvalidateRect)(hwnd, NULL, 0); + if(!DeleteObject(VirtualPic)) + OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + if(!DeleteObject(VirtualHDC)) + OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); ret=TRUE; return ret; } diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index c5200a0..4c06acf 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -69,6 +69,7 @@ public: // methods RECT GetWindowRect(RECT); RECT GetClientRect(RECT); POINT AddCoordinates(POINT, POINT); + RECT AddCoordinates(RECT, POINT); POINT SubCoordinates(POINT, POINT); POINT ClientOffset(HWND); void ScreenRefresh(void); @@ -158,6 +159,7 @@ protected: DWORD PrimSurfaces[DDSQLEN+1]; DWORD BackSurfaces[DDSQLEN+1]; HBITMAP VirtualPic; + RECT VirtualPicRect; private: void UnmarkPrimarySurface(LPDIRECTDRAWSURFACE); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index ae87207..3b0c00a 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.70" +#define VERSION "2.02.71" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 3f242f617af85b6febe7cc7691ad20497cb1142b..32012c6e66c244f860d4e1529b39cc3b9dabb783 100644 GIT binary patch delta 31670 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 b37yXIO^NXqFS7mKzL)VoC)=>n$+iC%vbb@j diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index e9509cc..705a153 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -36,8 +36,6 @@ ExtTextOutW_Type pExtTextOutW = NULL; ExtTextOutA_Type pExtTextOutA = NULL; static HookEntry_Type Hooks[]={ - {"ExtTextOutA", (FARPROC)ExtTextOutA, (FARPROC *)&pExtTextOutA, (FARPROC)extExtTextOutA}, - {"ExtTextOutW", (FARPROC)ExtTextOutW, (FARPROC *)&pExtTextOutW, (FARPROC)extExtTextOutW}, {"GetDeviceCaps", (FARPROC)GetDeviceCaps, (FARPROC *)&pGDIGetDeviceCaps, (FARPROC)extGetDeviceCaps}, {"ScaleWindowExtEx", (FARPROC)ScaleWindowExtEx, (FARPROC *)&pGDIScaleWindowExtEx, (FARPROC)extScaleWindowExtEx}, @@ -67,7 +65,6 @@ static HookEntry_Type RemapHooks[]={ {"GetWindowOrgEx", (FARPROC)NULL, (FARPROC *)&pGetWindowOrgEx, (FARPROC)extGetWindowOrgEx}, {"SetWindowOrgEx", (FARPROC)NULL, (FARPROC *)&pSetWindowOrgEx, (FARPROC)extSetWindowOrgEx}, {"GetCurrentPositionEx", (FARPROC)NULL, (FARPROC *)&pGetCurrentPositionEx, (FARPROC)extGetCurrentPositionEx}, - {"StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits}, // unuseful {"SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice}, // does the stretching {0, NULL, 0, 0} // terminator }; @@ -103,21 +100,18 @@ static HookEntry_Type ScaledHooks[]={ {"StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extGDIStretchBlt}, {"PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extGDIPatBlt}, {"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extMaskBlt}, - + {"ExtTextOutA", (FARPROC)ExtTextOutA, (FARPROC *)&pExtTextOutA, (FARPROC)extExtTextOutA}, + {"ExtTextOutW", (FARPROC)ExtTextOutW, (FARPROC *)&pExtTextOutW, (FARPROC)extExtTextOutW}, {0, NULL, 0, 0} // terminator }; static HookEntry_Type EmulateHooks[]={ - // useless CreateCompatibleDC: it maps VirtualHDC on top of VirtualHDC, then does nothing.... + // useless CreateCompatibleDC: it maps VirtualHDC on top of VirtualHDC, then does nothing, unless when asked to operate on 0!.... //{"CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extEMUCreateCompatibleDC}, // useless DeleteDC: it's just a proxy //{"DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extGDIDeleteDC}, {"CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extGDICreateDC}, // CreateDCW ..... - {"BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extGDIBitBlt}, - {"StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extGDIStretchBlt}, - {"PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extGDIPatBlt}, - {"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extMaskBlt}, {"GetObjectType", (FARPROC)GetObjectType, (FARPROC *)&pGetObjectType, (FARPROC)extGetObjectType}, {"GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox}, @@ -131,6 +125,7 @@ static HookEntry_Type DDHooks[]={ {"BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extDDBitBlt}, {"StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extDDStretchBlt}, {"GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox}, + // {"PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extDDPatBlt}, // missing one ... // {"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extDDMaskBlt}, // missing one ... {0, NULL, 0, 0} // terminator @@ -402,9 +397,10 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) BOOL WINAPI extTextOutA(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cchString) { BOOL ret; + extern BOOL gFixed; OutTraceDW("TextOut: hdc=%x xy=(%d,%d) str=(%d)\"%.*s\"\n", hdc, nXStart, nYStart, cchString, cchString, lpString); - if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + if (!gFixed && dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ dxw.MapClient(&nXStart, &nYStart); OutTraceDW("TextOut: fixed dest=(%d,%d)\n", nXStart, nYStart); } @@ -738,6 +734,13 @@ HDC WINAPI extDDGetDC(HWND hwnd) return ret; } +HDC WINAPI extDDGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) +{ + HDC ret; + ret=winDDGetDC(hwnd, "GDI.GetDCEx"); + return ret; +} + HDC WINAPI extDDGetWindowDC(HWND hwnd) { HDC ret; @@ -750,11 +753,11 @@ int WINAPI extDDReleaseDC(HWND hwnd, HDC hDC) int res; extern HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE, HDC); - OutTraceDW("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC); + OutTraceDW("GDI.ReleaseDC(DD): hwnd=%x hdc=%x\n", hwnd, hDC); res=0; if ((hDC == PrimHDC) || (hwnd==0)){ dxw.SetPrimarySurface(); - OutTraceDW("GDI.ReleaseDC: refreshing primary surface lpdds=%x\n",dxw.lpDDSPrimHDC); + OutTraceDW("GDI.ReleaseDC(DD): refreshing primary surface lpdds=%x\n",dxw.lpDDSPrimHDC); if(!dxw.lpDDSPrimHDC) return 0; extReleaseDC(dxw.lpDDSPrimHDC, hDC); PrimHDC=NULL; @@ -862,12 +865,12 @@ HDC WINAPI extGDICreateDC(LPSTR Driver, LPSTR Device, LPSTR Output, CONST DEVMOD HDC WINAPI extGDICreateCompatibleDC(HDC hdc) { - HDC RetHdc, SrcHdc; + HDC RetHdc; DWORD LastError; OutTraceDW("GDI.CreateCompatibleDC: hdc=%x\n", hdc); if(hdc==0){ - SrcHdc=(*pGDIGetDC)(dxw.GethWnd()); + hdc=(*pGDIGetDC)(dxw.GethWnd()); OutTraceDW("GDI.CreateCompatibleDC: duplicating win HDC hWnd=%x\n", dxw.GethWnd()); } @@ -882,34 +885,6 @@ HDC WINAPI extGDICreateCompatibleDC(HDC hdc) return RetHdc; } -//HDC WINAPI extEMUCreateCompatibleDC(HDC hdc) -//{ -// HDC RetHdc, SrcHdc; -// DWORD LastError; -// -// OutTraceDW("GDI.CreateCompatibleDC: hdc=%x\n", hdc); -// if((hdc==0) || (hdc==dxw.RealHDC)){ -// SrcHdc=dxw.AcquireEmulatedDC(dxw.GethWnd()); -// OutTraceDW("GDI.CreateCompatibleDC: using emulated HDC hWnd=%x hdc=%x\n", dxw.GethWnd(), SrcHdc); -// } -// -// // eliminated error message for errorcode 0. -// SetLastError(0); -// RetHdc=(*pGDICreateCompatibleDC)(hdc); -// LastError=GetLastError(); -// if(!LastError) -// OutTraceDW("GDI.CreateCompatibleDC: returning HDC=%x\n", RetHdc); -// else -// OutTraceE("GDI.CreateCompatibleDC ERROR: err=%d at %d\n", LastError, __LINE__); -// return RetHdc; -//} - -//BOOL WINAPI extEMUBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) -//{ -// if (hdcDest==dxw.RealHDC) hdcDest=dxw.VirtualHDC; -// return (*pGDIBitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); -//} - BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) { BOOL res; @@ -1837,51 +1812,29 @@ DWORD WINAPI extGetObjectType(HGDIOBJ h) return res; } -#if 0 -HBITMAP WINAPI extCreateDIBitmap(HDC hdc, const BITMAPINFOHEADER *lpbmih, DWORD fdwInit, const VOID *lpbInit, const BITMAPINFO *lpbmi, UINT fuUsage) -{ - OutTrace("CreateDIBitmap: hdc=x dwInit=%x bInit=%x Usage=%x\n", hdc, fdwInit, lpbInit, fuUsage); - return NULL; -} - - -int WINAPI extSetMapMode(HDC hdc, int fnMapMode) -{ - OutTraceDW("SetMapMode: hdc=%x MapMode=%d\n", hdc, fnMapMode); - return TRUE; -} - -// to map: -// GetCurrentPositionEx -// GetViewportExtEx -// DPtoLP -// GetWindowOrgEx -// LPtoDP -// OffsetViewportOrgEx -// OffsetWindowOrgEx -// TransparentBlt -// to do: eliminate FIXTEXTOUT handling -// GetDCEx - -BOOL SetTextJustification( - _In_ HDC hdc, - _In_ int nBreakExtra, <---- - _In_ int nBreakCount -); -#endif +extern BOOL gFixed; BOOL WINAPI extExtTextOutA(HDC hdc, int X, int Y, UINT fuOptions, const RECT *lprc, LPCSTR lpString, UINT cbCount, const INT *lpDx) { - OutTrace("ExtTextOutA: pos=(%d,%d) String=\"%s\"\n", X, Y, lpString); - //if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ - // dxw.MapClient(&X, &Y); - // if(lprc) dxw.MapClient((LPRECT)lprc); - // OutTraceDW("ExtTextOutA: fixed pos=(%d,%d)\n", X, Y); - //} - return (*pExtTextOutA)(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx); -} + RECT rc; + if(IsTraceDW){ + OutTrace("ExtTextOutA: hdc=%x pos=(%d,%d) String=\"%s\" rect=", hdc, X, Y, lpString); + if(lprc) + OutTrace("(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); + else + OutTrace("NULL\n"); + } -extern BOOL gFixed; + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)) && !gFixed){ + dxw.MapClient(&X, &Y); + if(lprc) dxw.MapClient(&rc); + OutTraceDW("ExtTextOutA: fixed pos=(%d,%d)\n", X, Y); + } + if(lprc) + return (*pExtTextOutA)(hdc, X, Y, fuOptions, &rc, lpString, cbCount, lpDx); + else + return (*pExtTextOutA)(hdc, X, Y, fuOptions, NULL, lpString, cbCount, lpDx); +} BOOL WINAPI extExtTextOutW(HDC hdc, int X, int Y, UINT fuOptions, const RECT *lprc, LPCWSTR lpString, UINT cbCount, const INT *lpDx) { @@ -1894,11 +1847,7 @@ BOOL WINAPI extExtTextOutW(HDC hdc, int X, int Y, UINT fuOptions, const RECT *lp OutTrace("NULL\n"); } - //return (*pExtTextOutW)(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx); - if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)) && !gFixed){ - //dxw.UnmapClient(&X, &Y); - //if(lprc) dxw.UnmapClient(&rc); dxw.MapClient(&X, &Y); if(lprc) dxw.MapClient(&rc); OutTraceDW("ExtTextOutW: fixed pos=(%d,%d)\n", X, Y); diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 669baa3..59a779b 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -508,7 +508,8 @@ static void DumpD3DDevideDesc(LPD3DDEVICEDESC d3, char *label) if(d3->dwFlags & D3DDD_DEVICEZBUFFERBITDEPTH) OutTrace("DeviceZBufferBitDepth=%d ", d3->dwDeviceZBufferBitDepth); if(d3->dwFlags & D3DDD_MAXBUFFERSIZE) OutTrace("MaxBufferSize=%d ", d3->dwMaxBufferSize); if(d3->dwFlags & D3DDD_MAXVERTEXCOUNT) OutTrace("MaxVertexCount=%d ", d3->dwMaxVertexCount); - OutTrace("\n"); + OutTrace("Texture min=(%dx%d) max=(%dx%d)\n", d3->dwMinTextureWidth, d3->dwMinTextureHeight, d3->dwMaxTextureWidth, d3->dwMaxTextureHeight); + //OutTrace("\n"); } else OutTrace("EnumDevices: CALLBACK dev=%s ddesc=NULL\n", label); diff --git a/dll/syslibs.h b/dll/syslibs.h index 3c169ce..bf6a021 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -360,7 +360,8 @@ DXWEXTERN GetDesktopWindow_Type pGetDesktopWindow DXWINITIALIZED; DXWEXTERN GetSystemMetrics_Type pGetSystemMetrics DXWINITIALIZED; DXWEXTERN GetTopWindow_Type pGetTopWindow DXWINITIALIZED; DXWEXTERN GDIGetDC_Type pGDIGetWindowDC DXWINITIALIZED; -DXWEXTERN GetWindowLong_Type pGetWindowLong DXWINITIALIZED; +DXWEXTERN GetWindowLong_Type pGetWindowLongA DXWINITIALIZED; +DXWEXTERN GetWindowLong_Type pGetWindowLongW DXWINITIALIZED; DXWEXTERN GetWindowRect_Type pGetWindowRect DXWINITIALIZED; DXWEXTERN InvalidateRect_Type pInvalidateRect DXWINITIALIZED; DXWEXTERN MapWindowPoints_Type pMapWindowPoints DXWINITIALIZED; @@ -375,7 +376,8 @@ DXWEXTERN SendMessage_Type pSendMessageW DXWINITIALIZED; DXWEXTERN SetCursor_Type pSetCursor DXWINITIALIZED; DXWEXTERN SetCursorPos_Type pSetCursorPos DXWINITIALIZED; DXWEXTERN SetTimer_Type pSetTimer DXWINITIALIZED; -DXWEXTERN SetWindowLong_Type pSetWindowLong DXWINITIALIZED; +DXWEXTERN SetWindowLong_Type pSetWindowLongA DXWINITIALIZED; +DXWEXTERN SetWindowLong_Type pSetWindowLongW DXWINITIALIZED; DXWEXTERN SetWindowPos_Type pSetWindowPos DXWINITIALIZED; DXWEXTERN ShowCursor_Type pShowCursor DXWINITIALIZED; DXWEXTERN ShowWindow_Type pShowWindow DXWINITIALIZED; @@ -528,6 +530,7 @@ extern HRESULT STDAPICALLTYPE extCoInitialize(LPVOID); // user32.dll: extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT); +extern HDC WINAPI extEMUBeginPaint(HWND, LPPAINTSTRUCT); extern HDC WINAPI extDDBeginPaint(HWND, LPPAINTSTRUCT); extern LRESULT WINAPI extCallWindowProc(WNDPROC, HWND, UINT, WPARAM, LPARAM); extern LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *, DWORD); @@ -544,6 +547,7 @@ extern LRESULT WINAPI extDefWindowProc(HWND, UINT, WPARAM, LPARAM); extern int WINAPI extDrawTextA(HDC, LPCTSTR, int, LPRECT, UINT); extern int WINAPI extDrawTextExA(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *); +extern BOOL WINAPI extEMUEndPaint(HWND, const PAINTSTRUCT *); extern BOOL WINAPI extDDEndPaint(HWND, const PAINTSTRUCT *); extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *); extern int WINAPI extFillRect(HDC, const RECT *, HBRUSH); @@ -552,13 +556,16 @@ extern BOOL WINAPI extGetClientRect(HWND, LPRECT); extern BOOL WINAPI extGetClipCursor(LPRECT); extern BOOL WINAPI extGetCursorPos(LPPOINT); extern HDC WINAPI extGDIGetDC(HWND); +extern HDC WINAPI extEMUGetDC(HWND); extern HDC WINAPI extDDGetDC(HWND); extern HWND WINAPI extGetDesktopWindow(void); extern int WINAPI extGetSystemMetrics(int); extern HWND WINAPI extGetTopWindow(HWND); extern HDC WINAPI extGDIGetWindowDC(HWND); +extern HDC WINAPI extEMUGetWindowDC(HWND); extern HDC WINAPI extDDGetWindowDC(HWND); -extern LONG WINAPI extGetWindowLong(HWND, int); +extern LONG WINAPI extGetWindowLongA(HWND, int); +extern LONG WINAPI extGetWindowLongW(HWND, int); extern BOOL WINAPI extGetWindowRect(HWND, LPRECT); extern BOOL WINAPI extInvalidateRect(HWND, RECT *, BOOL); //extern BOOL WINAPI extDDInvalidateRect(HWND, RECT *, BOOL); @@ -567,15 +574,17 @@ extern BOOL WINAPI extMoveWindow(HWND, int, int, int, int, BOOL); extern BOOL WINAPI extPeekMessage(LPMSG, HWND, UINT, UINT, UINT); extern ATOM WINAPI extRegisterClassExA(WNDCLASSEXA *); extern ATOM WINAPI extRegisterClassA(WNDCLASSA *); -extern int WINAPI extDDReleaseDC(HWND, HDC); extern int WINAPI extGDIReleaseDC(HWND, HDC); +extern int WINAPI extEMUReleaseDC(HWND, HDC); +extern int WINAPI extDDReleaseDC(HWND, HDC); extern BOOL WINAPI extScreenToClient(HWND, LPPOINT); extern LRESULT WINAPI extSendMessageA(HWND, UINT, WPARAM, LPARAM); extern LRESULT WINAPI extSendMessageW(HWND, UINT, WPARAM, LPARAM); extern HCURSOR WINAPI extSetCursor(HCURSOR); extern BOOL WINAPI extSetCursorPos(int, int); extern UINT_PTR WINAPI extSetTimer(HWND, UINT_PTR, UINT, TIMERPROC); -extern LONG WINAPI extSetWindowLong(HWND, int, LONG); +extern LONG WINAPI extSetWindowLongA(HWND, int, LONG); +extern LONG WINAPI extSetWindowLongW(HWND, int, LONG); extern BOOL WINAPI extSetWindowPos(HWND, HWND, int, int, int, int, UINT); extern int WINAPI extShowCursor(BOOL); extern BOOL WINAPI extShowWindow(HWND, int); @@ -584,6 +593,8 @@ extern BOOL WINAPI extDestroyWindow(HWND); extern BOOL WINAPI extCloseWindow(HWND); extern BOOL WINAPI extSetSysColors(int, const INT *, const COLORREF *); extern HDC WINAPI extGDIGetDCEx(HWND, HRGN, DWORD); +extern HDC WINAPI extEMUGetDCEx(HWND, HRGN, DWORD); +extern HDC WINAPI extDDGetDCEx(HWND, HRGN, DWORD); extern BOOL WINAPI extUpdateWindow(HWND); extern BOOL WINAPI extGetWindowPlacement(HWND, WINDOWPLACEMENT *); extern BOOL WINAPI extSetWindowPlacement(HWND, WINDOWPLACEMENT *); diff --git a/dll/user32.cpp b/dll/user32.cpp index 72fae92..f691a42 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -26,8 +26,6 @@ static HookEntry_Type Hooks[]={ {"EnumDisplaySettingsA", (FARPROC)EnumDisplaySettingsA, (FARPROC *)&pEnumDisplaySettings, (FARPROC)extEnumDisplaySettings}, {"GetClipCursor", (FARPROC)GetClipCursor, (FARPROC*)&pGetClipCursor, (FARPROC)extGetClipCursor}, {"ClipCursor", (FARPROC)ClipCursor, (FARPROC *)&pClipCursor, (FARPROC)extClipCursor}, - {"FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect}, - {"FrameRect", (FARPROC)NULL, (FARPROC *)&pFrameRect, (FARPROC)extFrameRect}, {"DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProc, (FARPROC)extDefWindowProc}, {"CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA}, {"CreateWindowExW", (FARPROC)CreateWindowExW, (FARPROC *)&pCreateWindowExW, (FARPROC)extCreateWindowExW}, @@ -35,13 +33,14 @@ static HookEntry_Type Hooks[]={ {"RegisterClassA", (FARPROC)RegisterClassA, (FARPROC *)&pRegisterClassA, (FARPROC)extRegisterClassA}, {"GetSystemMetrics", (FARPROC)GetSystemMetrics, (FARPROC *)&pGetSystemMetrics, (FARPROC)extGetSystemMetrics}, {"GetDesktopWindow", (FARPROC)GetDesktopWindow, (FARPROC *)&pGetDesktopWindow, (FARPROC)extGetDesktopWindow}, - {"TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA}, - {"DrawTextA", (FARPROC)DrawTextA, (FARPROC *)&pDrawText, (FARPROC)extDrawTextA}, - {"DrawTextExA", (FARPROC)DrawTextExA, (FARPROC *)&pDrawTextEx, (FARPROC)extDrawTextExA}, {"CloseWindow", (FARPROC)NULL, (FARPROC *)&pCloseWindow, (FARPROC)extCloseWindow}, {"DestroyWindow", (FARPROC)NULL, (FARPROC *)&pDestroyWindow, (FARPROC)extDestroyWindow}, {"SetSysColors", (FARPROC)NULL, (FARPROC *)&pSetSysColors, (FARPROC)extSetSysColors}, {"SetCapture", (FARPROC)NULL, (FARPROC *)&pSetCapture, (FARPROC)extSetCapture}, + {"SetWindowLongA", (FARPROC)SetWindowLongA, (FARPROC *)&pSetWindowLongA, (FARPROC)extSetWindowLongA}, + {"GetWindowLongA", (FARPROC)GetWindowLongA, (FARPROC *)&pGetWindowLongA, (FARPROC)extGetWindowLongA}, + {"SetWindowLongW", (FARPROC)SetWindowLongW, (FARPROC *)&pSetWindowLongW, (FARPROC)extSetWindowLongW}, + {"GetWindowLongW", (FARPROC)GetWindowLongW, (FARPROC *)&pGetWindowLongW, (FARPROC)extGetWindowLongW}, //{"GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow}, //{"GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, @@ -57,12 +56,13 @@ static HookEntry_Type NoGDIHooks[]={ }; static HookEntry_Type EmulateHooks[]={ - {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint}, - {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint}, - {"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC}, - {"GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extGDIGetWindowDC}, - {"ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extGDIReleaseDC}, - {"InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, + {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extEMUBeginPaint}, + {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEMUEndPaint}, + {"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extEMUGetDC}, + {"GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extEMUGetDCEx}, + {"GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extEMUGetWindowDC}, + {"ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extEMUReleaseDC}, + //{"InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, {0, NULL, 0, 0} // terminator }; @@ -70,6 +70,7 @@ static HookEntry_Type DDHooks[]={ {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extDDBeginPaint}, {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extDDEndPaint}, {"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extDDGetDC}, + {"GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extDDGetDCEx}, {"GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extDDGetDC}, {"ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extDDReleaseDC}, {"InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, @@ -77,6 +78,11 @@ static HookEntry_Type DDHooks[]={ }; static HookEntry_Type ScaledHooks[]={ + {"FrameRect", (FARPROC)NULL, (FARPROC *)&pFrameRect, (FARPROC)extFrameRect}, + {"TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA}, + {"DrawTextA", (FARPROC)DrawTextA, (FARPROC *)&pDrawText, (FARPROC)extDrawTextA}, + {"DrawTextExA", (FARPROC)DrawTextExA, (FARPROC *)&pDrawTextEx, (FARPROC)extDrawTextExA}, + {"FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect}, {"BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint}, {"EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint}, {"GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC}, @@ -114,8 +120,6 @@ static HookEntry_Type MouseHooks[]={ static HookEntry_Type WinHooks[]={ {"ShowWindow", (FARPROC)ShowWindow, (FARPROC *)&pShowWindow, (FARPROC)extShowWindow}, - {"SetWindowLongA", (FARPROC)SetWindowLongA, (FARPROC *)&pSetWindowLong, (FARPROC)extSetWindowLong}, - {"GetWindowLongA", (FARPROC)GetWindowLongA, (FARPROC *)&pGetWindowLong, (FARPROC)extGetWindowLong}, {"SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos}, {"DeferWindowPos", (FARPROC)DeferWindowPos, (FARPROC *)&pGDIDeferWindowPos, (FARPROC)extDeferWindowPos}, {"CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProc, (FARPROC)extCallWindowProc}, @@ -422,9 +426,18 @@ static LRESULT WINAPI FixWindowProc(char *ApiName, HWND hwnd, UINT Msg, WPARAM w ApiName, hwnd, Msg, ExplainWinMessage(Msg), wParam, lParam); switch(Msg){ + case WM_NCHITTEST: + // v2.02.71 fix: when processing WM_NCHITTEST messages whith fixed coordinates avoid calling + // the *pDefWindowProc call + // fixes "Microsoft Motocross Madness" mouse handling + if((dxw.dwFlags2 & FIXNCHITTEST) && (dxw.dwFlags1 & MODIFYMOUSE)){ // mouse processing + OutTraceDW("%s: suppress WM_NCHITTEST\n", ApiName); + return TRUE; + } + break; case WM_ERASEBKGND: OutTraceDW("%s: prevent erase background\n", ApiName); - return 1; // 1=erased + return TRUE; // 1=erased break; // useless case WM_GETMINMAXINFO: dxwFixMinMaxInfo(ApiName, hwnd, lParam); @@ -480,7 +493,6 @@ BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase) return (*pInvalidateRect)(hwnd, lpRect, bErase); } else{ - //dxw.MapClient(lpRect); // just exagerate ... return (*pInvalidateRect)(hwnd, NULL, bErase); } @@ -512,11 +524,11 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow) return res; } -LONG WINAPI extGetWindowLong(HWND hwnd, int nIndex) +LONG WINAPI extGetWindowLong(HWND hwnd, int nIndex, GetWindowLong_Type pGetWindowLong) { LONG res; - res=(*pGetWindowLong)(hwnd, nIndex); + res=(*pGetWindowLongA)(hwnd, nIndex); OutTraceDW("GetWindowLong: hwnd=%x, Index=%x(%s) res=%x\n", hwnd, nIndex, ExplainSetWindowIndex(nIndex), res); @@ -530,7 +542,17 @@ LONG WINAPI extGetWindowLong(HWND hwnd, int nIndex) return res; } -LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) +LONG WINAPI extGetWindowLongA(HWND hwnd, int nIndex) +{ + return extGetWindowLong(hwnd, nIndex, pGetWindowLongA); +} + +LONG WINAPI extGetWindowLongW(HWND hwnd, int nIndex) +{ + return extGetWindowLong(hwnd, nIndex, pGetWindowLongW); +} + +LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLong_Type pSetWindowLong) { LONG res; @@ -543,12 +565,12 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) if(nIndex==GWL_STYLE){ OutTraceDW("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong); //return 1; - return (*pGetWindowLong)(hwnd, nIndex); + return (*pGetWindowLongA)(hwnd, nIndex); } if(nIndex==GWL_EXSTYLE){ OutTraceDW("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong); //return 1; - return (*pGetWindowLong)(hwnd, nIndex); + return (*pGetWindowLongA)(hwnd, nIndex); } } @@ -587,7 +609,7 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) } // end of GPL fix - OldProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC); + OldProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); // v2.02.70 fix if((OldProc==extWindowProc) || (OldProc==extChildWindowProc)|| @@ -596,17 +618,27 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) WhndStackPush(hwnd, (WNDPROC)dwNewLong); res=(LONG)OldProc; SetLastError(0); - lres=(WNDPROC)(*pSetWindowLong)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); + lres=(WNDPROC)(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); if(!lres && GetLastError())OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } else { - res=(*pSetWindowLong)(hwnd, nIndex, dwNewLong); + res=(*pSetWindowLongA)(hwnd, nIndex, dwNewLong); } OutTraceDW("SetWindowLong: hwnd=%x, nIndex=%x, Val=%x, res=%x\n", hwnd, nIndex, dwNewLong, res); return res; } +LONG WINAPI extSetWindowLongA(HWND hwnd, int nIndex, LONG dwNewLong) +{ + return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongA); +} + +LONG WINAPI extSetWindowLongW(HWND hwnd, int nIndex, LONG dwNewLong) +{ + return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongW); +} + BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags) { BOOL res; @@ -650,8 +682,8 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c RECT rect; rect.top=rect.left=0; rect.right=cx; rect.bottom=cy; - dwCurStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLong)(hwnd, GWL_EXSTYLE); + dwCurStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); + dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); // BEWARE: from MSDN - If the window is a child window, the return value is undefined. hMenu = (dwCurStyle & WS_CHILD) ? NULL : GetMenu(hwnd); AdjustWindowRectEx(&rect, dwCurStyle, (hMenu!=NULL), dwExStyle); @@ -1220,8 +1252,8 @@ static HWND WINAPI extCreateWindowCommon( if ((!isValidHandle) && dxw.IsFullScreen()){ dxw.SethWnd(hwnd); extern void AdjustWindowPos(HWND, DWORD, DWORD); - (*pSetWindowLong)(hwnd, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW); - (*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0); + (*pSetWindowLongA)(hwnd, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW); + (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0); OutTraceDW("%s: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", ApiName, hwnd); AdjustWindowPos(hwnd, nWidth, nHeight); (*pShowWindow)(hwnd, SW_SHOWNORMAL); @@ -1237,7 +1269,7 @@ static HWND WINAPI extCreateWindowCommon( // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve // the correct value (WhndGetWindowProc) before saving it (WhndStackPush). long res; - pWindowProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC); + pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); if((pWindowProc == extWindowProc) || (pWindowProc == extChildWindowProc) || (pWindowProc == extDialogWindowProc)){ // avoid recursions @@ -1246,7 +1278,7 @@ static HWND WINAPI extCreateWindowCommon( pWindowProc=WhndGetWindowProc(Father); } OutTraceDW("Hooking CHILD hwnd=%x father WindowProc %x->%x\n", hwnd, pWindowProc, extChildWindowProc); - res=(*pSetWindowLong)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc); + res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc); if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError()); WhndStackPush(hwnd, pWindowProc); } @@ -1592,28 +1624,6 @@ LONG WINAPI extChangeDisplaySettingsExW(LPCTSTR lpszDeviceName, DEVMODEW *lpDevM return MyChangeDisplaySettings("ChangeDisplaySettingsExW", TRUE, lpDevMode, dwflags); } -//HDC WINAPI extEMUGetDC(HWND hwnd) -//{ -// HDC ret; -// -// OutTraceDW("GDI.GetDC: hwnd=%x\n", hwnd); -// -// if (dxw.IsDesktop(hwnd)) { -// OutTraceDW("GDI.GetDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); -// hwnd=dxw.GethWnd(); -// ret=dxw.AcquireEmulatedDC(hwnd); -// } -// else{ -// ret=(*pGDIGetDC)(hwnd); -// } -// if(ret) -// OutTraceDW("GDI.GetDC: hwnd=%x ret=%x\n", lochwnd, ret); -// else -// OutTraceE("GDI.GetDC ERROR: hwnd=%x err=%d at %d\n", lochwnd, err, __LINE__); -// -// return ret; -//} - HDC WINAPI extGDIGetDC(HWND hwnd) { HDC ret; @@ -1627,12 +1637,41 @@ HDC WINAPI extGDIGetDC(HWND hwnd) } ret=(*pGDIGetDC)(lochwnd); - - if((dxw.dwFlags3 & GDIEMULATEDC) && (dxw.IsDesktop(hwnd)) && (dxw.VirtualHDC==NULL)){ - ret=dxw.AcquireEmulatedDC(lochwnd); - OutTraceDW("GDI.GetDC(GDIEMULATEDC): remapping hdc=%x->%x\n", (*pGDIGetDC)(hwnd), ret); - dxw.VirtualHDC=ret; + + if(ret){ + OutTraceDW("GDI.GetDC: hwnd=%x ret=%x\n", lochwnd, ret); } + else{ + int err; + err=GetLastError(); + OutTraceE("GDI.GetDC ERROR: hwnd=%x err=%d at %d\n", lochwnd, err, __LINE__); + if((err==ERROR_INVALID_WINDOW_HANDLE) && (lochwnd!=hwnd)){ + ret=(*pGDIGetDC)(hwnd); + if(ret) + OutTraceDW("GDI.GetDC: hwnd=%x ret=%x\n", hwnd, ret); + else + OutTraceE("GDI.GetDC ERROR: hwnd=%x err=%d at %d\n", hwnd, GetLastError(), __LINE__); + } + } + + return ret; +} + +HDC WINAPI extEMUGetDC(HWND hwnd) +{ + HDC ret; + HWND lochwnd; + + OutTraceDW("GDI.GetDC: hwnd=%x\n", hwnd); + lochwnd=hwnd; + if (dxw.IsRealDesktop(hwnd)) { + OutTraceDW("GDI.GetDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + lochwnd=dxw.GethWnd(); + } + + ret=dxw.AcquireEmulatedDC(lochwnd); + OutTraceDW("GDI.GetDC: remapping hdc=%x->%x\n", (*pGDIGetDC)(hwnd), ret); + dxw.VirtualHDC=ret; if(ret){ OutTraceDW("GDI.GetDC: hwnd=%x ret=%x\n", lochwnd, ret); @@ -1666,10 +1705,43 @@ HDC WINAPI extGDIGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) lochwnd=dxw.GethWnd(); } - if(dxw.dwFlags3 & GDIEMULATEDC) - ret=dxw.AcquireEmulatedDC(lochwnd); - else - ret=(*pGDIGetDC)(lochwnd); + ret=(*pGDIGetDC)(lochwnd); + + if(ret){ + OutTraceDW("GDI.GetDCEx: hwnd=%x ret=%x\n", lochwnd, ret); + } + else{ + int err; + err=GetLastError(); + OutTraceE("GDI.GetDCEx ERROR: hwnd=%x err=%d at %d\n", lochwnd, err, __LINE__); + if((err==ERROR_INVALID_WINDOW_HANDLE) && (lochwnd!=hwnd)){ + ret=(*pGDIGetDCEx)(hwnd, hrgnClip, flags); + if(ret) + OutTraceDW("GDI.GetDCEx: hwnd=%x ret=%x\n", hwnd, ret); + else + OutTraceE("GDI.GetDCEx ERROR: hwnd=%x err=%d at %d\n", hwnd, GetLastError(), __LINE__); + } + } + + return ret; +} + +HDC WINAPI extEMUGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) +{ + // used by Star Wars Shadow of the Empire + HDC ret; + HWND lochwnd; + + OutTraceDW("GDI.GetDCEx: hwnd=%x hrgnClip=%x flags=%x(%s)\n", hwnd, hrgnClip, flags, ExplainGetDCExFlags(flags)); + lochwnd=hwnd; + if (dxw.IsRealDesktop(hwnd)) { + OutTraceDW("GDI.GetDCEx: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + lochwnd=dxw.GethWnd(); + } + + ret=dxw.AcquireEmulatedDC(lochwnd); + OutTraceDW("GDI.GetDCEx: remapping hdc=%x->%x\n", (*pGDIGetDC)(hwnd), ret); + dxw.VirtualHDC=ret; if(ret){ OutTraceDW("GDI.GetDCEx: hwnd=%x ret=%x\n", lochwnd, ret); @@ -1701,6 +1773,43 @@ HDC WINAPI extGDIGetWindowDC(HWND hwnd) lochwnd=dxw.GethWnd(); } + if(dxw.IsFullScreen()){ + ret=dxw.AcquireEmulatedDC(lochwnd); + OutTraceDW("GDI.GetWindowDC: remapping hdc=%x->%x\n", (*pGDIGetDC)(hwnd), ret); + dxw.VirtualHDC=ret; + } + else + ret=(*pGDIGetWindowDC)(lochwnd); + + if(ret){ + OutTraceDW("GDI.GetWindowDC: hwnd=%x ret=%x\n", lochwnd, ret); + } + else{ + int err; + err=GetLastError(); + OutTraceE("GDI.GetWindowDC ERROR: hwnd=%x err=%d at %d\n", lochwnd, err, __LINE__); + if((err==ERROR_INVALID_WINDOW_HANDLE) && (lochwnd!=hwnd)){ + ret=(*pGDIGetWindowDC)(hwnd); + if(ret) + OutTraceDW("GDI.GetWindowDC: hwnd=%x ret=%x\n", hwnd, ret); + else + OutTraceE("GDI.GetWindowDC ERROR: hwnd=%x err=%d at %d\n", hwnd, GetLastError(), __LINE__); + } + } + return ret; +} + +HDC WINAPI extEMUGetWindowDC(HWND hwnd) +{ + HDC ret; + HWND lochwnd; + OutTraceDW("GDI.GetWindowDC: hwnd=%x\n", hwnd); + lochwnd=hwnd; + if (dxw.IsRealDesktop(hwnd)) { + OutTraceDW("GDI.GetWindowDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + lochwnd=dxw.GethWnd(); + } + if(dxw.IsDesktop(hwnd) && dxw.IsFullScreen()) ret=(*pGDIGetDC)(lochwnd); else @@ -1729,13 +1838,24 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) int res; OutTraceDW("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC); - if (dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - if((dxw.dwFlags3 & GDIEMULATEDC) && (hDC == dxw.VirtualHDC)) // v2.02.53 !!!!! - res=dxw.ReleaseEmulatedDC(hwnd); - else - res=(*pGDIReleaseDC)(hwnd, hDC); - + if (dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); + res=(*pGDIReleaseDC)(hwnd, hDC); + if (!res) OutTraceE("GDI.ReleaseDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); + return(res); +} + +int WINAPI extEMUReleaseDC(HWND hwnd, HDC hDC) +{ + int res; + HDC windc; + + OutTraceDW("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC); + + if (dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); + windc=(*pGDIGetDC)(hwnd); + res=dxw.ReleaseEmulatedDC(hwnd); + res=(*pGDIReleaseDC)(hwnd, windc); if (!res) OutTraceE("GDI.ReleaseDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); return(res); } @@ -1747,28 +1867,42 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) OutTraceDW("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen()); hdc=(*pBeginPaint)(hwnd, lpPaint); + // avoid access to real desktop + if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); + // if not in fullscreen mode, that's all! if(!dxw.IsFullScreen()) return hdc; // on CLIENTREMAPPING, resize the paint area to virtual screen size if(dxw.dwFlags1 & CLIENTREMAPPING) lpPaint->rcPaint=dxw.GetScreenRect(); - if(!dxw.IsDesktop(hwnd)) return hdc; - - if(dxw.dwFlags3 & GDIEMULATEDC) { - HDC EmuHDC; - EmuHDC = dxw.AcquireEmulatedDC(hwnd); - lpPaint->hdc=EmuHDC; - //dxw.MapClient(&lpPaint->rcPaint); - OutTraceDW("GDI.BeginPaint(GDIEMULATEDC): hdc=%x -> %x\n", hdc, EmuHDC); - return EmuHDC; - } - OutTraceDW("GDI.BeginPaint: hdc=%x\n", hdc); return hdc; } -#ifndef EXPERIMENTAL +HDC WINAPI extEMUBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) +{ + HDC hdc; + HDC EmuHDC; + + OutTraceDW("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen()); + hdc=(*pBeginPaint)(hwnd, lpPaint); + + // avoid access to real desktop + if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); + + // if not in fullscreen mode, that's all! + if(!dxw.IsFullScreen()) return hdc; + + // on CLIENTREMAPPING, resize the paint area to virtual screen size + if(dxw.dwFlags1 & CLIENTREMAPPING) lpPaint->rcPaint=dxw.GetScreenRect(); + + EmuHDC = dxw.AcquireEmulatedDC(hwnd); + lpPaint->hdc=EmuHDC; + OutTraceDW("GDI.BeginPaint: hdc=%x -> %x\n", hdc, EmuHDC); + return EmuHDC; +} + HDC WINAPI extDDBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) { HDC hdc; @@ -1814,51 +1948,6 @@ HDC WINAPI extDDBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): hdc=%x -> %x\n", hdc, PrimHDC); return PrimHDC; } -#else -HDC WINAPI extDDBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) -{ - HDC hdc; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("GDI.BeginPaint: hwnd=%x%s lpPaint=%x FullScreen=%x\n", - hwnd, dxw.IsDesktop(hwnd)?"(DESKTOP)":"", lpPaint, dxw.IsFullScreen()); - - if(dxw.IsDesktop(hwnd)) hwnd=dxw.GethWnd(); - - hdc=(*pBeginPaint)(hwnd, lpPaint); - - // if not in fullscreen mode, that's all! - if(!dxw.IsFullScreen()) return hdc; - - // on MAPGDITOPRIMARY, return the PrimHDC handle instead of the window DC - // if a primary surface has not been created yet, do it - if(!pGetDC || !dxw.lpDDSPrimHDC){ - extern HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *); - HRESULT res; - LPDIRECTDRAW lpDD; - LPDIRECTDRAWSURFACE lpDDS; - DDSURFACEDESC ddsd; - res=extDirectDrawCreate(0, &lpDD, NULL); - lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); - memset((void *)&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - ddsd.dwHeight = dxw.GetScreenHeight(); - ddsd.dwWidth = dxw.GetScreenWidth(); - res=lpDD->CreateSurface(&ddsd, &lpDDS, NULL); - dxw.lpDDSPrimHDC = lpDDS; - OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): dd=%x ddsPrim=%x\n", lpDD, lpDDS); - } - - HDC EmuHDC; - EmuHDC = dxw.AcquireEmulatedDC(dxw.lpDDSPrimHDC); - lpPaint->hdc=EmuHDC; - lpPaint->rcPaint=dxw.GetScreenRect(); - OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): hdc=%x -> %x\n", hdc, EmuHDC); - return EmuHDC; -} -#endif BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) { @@ -1866,11 +1955,23 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) OutTraceDW("GDI.EndPaint: hwnd=%x lpPaint=%x lpPaint.hdc=%x\n", hwnd, lpPaint, lpPaint->hdc); - if((dxw.dwFlags3 & GDIEMULATEDC) && dxw.IsFullScreen() && dxw.IsDesktop(hwnd)){ + ret=(*pEndPaint)(hwnd, lpPaint); + OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); + if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); + return ret; +} + +BOOL WINAPI extEMUEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) +{ + BOOL ret; + + OutTraceDW("GDI.EndPaint: hwnd=%x lpPaint=%x lpPaint.hdc=%x\n", hwnd, lpPaint, lpPaint->hdc); + + if(dxw.IsFullScreen()){ OutTraceDW("GDI.EndPaint(GDIEMULATEDC): hwnd=%x\n", hwnd); ret=dxw.ReleaseEmulatedDC(hwnd); } - + else // proxy part ... ret=(*pEndPaint)(hwnd, lpPaint); OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); @@ -1878,7 +1979,6 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) return ret; } -#ifndef EXPERIMENTAL BOOL WINAPI extDDEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) { BOOL ret; @@ -1886,16 +1986,32 @@ BOOL WINAPI extDDEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); extern HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx); - OutTraceDW("GDI.EndPaint: hwnd=%x%s lpPaint=%x lpPaint.hdc=%x\n", + OutTraceDW("GDI.EndPaint(DD): hwnd=%x%s lpPaint=%x lpPaint.hdc=%x\n", hwnd, dxw.IsDesktop(hwnd)?"(DESKTOP)":"", lpPaint, lpPaint->hdc); // v2.02.53 ... //if(dxw.IsFullScreen() && dxw.IsDesktop(hwnd)){ if(dxw.IsFullScreen()){ + RECT Rect; + LPRECT lpRect; ret=(*pEndPaint)(hwnd, lpPaint); dxw.lpDDSPrimHDC->Unlock(NULL); //dxw.ScreenRefresh(); - extBlt(dxw.lpDDSPrimHDC, NULL, dxw.lpDDSPrimHDC, NULL, 0, NULL); + if(dxw.IsDesktop(hwnd)) + lpRect=NULL; + else{ + POINT p={0,0}; + lpRect=&Rect; + (*pGetClientRect)(hwnd, lpRect); + p=dxw.ClientOffset(hwnd); + lpRect->left += p.x; + lpRect->right += p.x; + lpRect->top += p.y; + lpRect->bottom += p.y; + //dxw.AddCoordinates(lpRect, p); + dxw.UnmapClient(lpRect); + } + extBlt(dxw.lpDDSPrimHDC, lpRect, dxw.lpDDSPrimHDC, NULL, 0, NULL); return TRUE; } @@ -1905,40 +2021,6 @@ BOOL WINAPI extDDEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); return ret; } -#else -BOOL WINAPI extDDEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) -{ - BOOL ret; - extern HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc); - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - extern HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx); - - OutTraceDW("GDI.EndPaint: hwnd=%x%s lpPaint=%x lpPaint.hdc=%x\n", - hwnd, dxw.IsDesktop(hwnd)?"(DESKTOP)":"", lpPaint, lpPaint->hdc); - - // v2.02.53 ... - //if(dxw.IsFullScreen() && dxw.IsDesktop(hwnd)){ - if(dxw.IsFullScreen()){ - RECT client; - HDC hdc; - ret=(*pEndPaint)(hwnd, lpPaint); - (*pGetDC)(dxw.lpDDSPrimHDC, &hdc); - (*pGetClientRect)(hwnd, &client); - if(!(*pGDIBitBlt)(hdc, 0, 0, client.right, client.bottom, lpPaint->hdc, 0, 0, SRCCOPY)) - OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__); - extReleaseDC(dxw.lpDDSPrimHDC, hdc); - //dxw.ScreenRefresh(); - extBlt(dxw.lpDDSPrimHDC, NULL, dxw.lpDDSPrimHDC, NULL, 0, NULL); - return TRUE; - } - - // proxy part ... - ret=(*pEndPaint)(hwnd, lpPaint); - OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); - if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); - return ret; -} -#endif HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) { @@ -1950,7 +2032,7 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT RetHWND=(*pCreateDialogIndirectParam)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); WhndStackPush(RetHWND, (WNDPROC)lpDialogFunc); - if(!(*pSetWindowLong)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) + if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); OutTraceDW("CreateDialogIndirectParam: hwnd=%x\n", RetHWND); @@ -1969,7 +2051,7 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW RetHWND=(*pCreateDialogParam)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, lParamInit); WhndStackPush(RetHWND, (WNDPROC)lpDialogFunc); - if(!(*pSetWindowLong)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) + if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); OutTraceDW("CreateDialogParam: hwnd=%x\n", RetHWND); @@ -2002,7 +2084,7 @@ BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL BOOL isChild; (*pClientToScreen)(dxw.GethWnd(),&upleft); (*pGetClientRect)(dxw.GethWnd(),&client); - if ((*pGetWindowLong)(hwnd, GWL_STYLE) & WS_CHILD){ + if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){ isChild=TRUE; // child coordinate adjustement X = (X * client.right) / dxw.GetScreenWidth(); diff --git a/host/Resource.h b/host/Resource.h index a2b451b..4d5e70f 100644 --- a/host/Resource.h +++ b/host/Resource.h @@ -47,6 +47,8 @@ #define IDC_FILE 1000 #define IDC_OPEN 1001 #define IDC_MODULE 1002 +#define IDC_LAUNCH 1003 +#define IDC_OPENLAUNCH 1004 #define IDC_STATUSINFO 1005 #define IDC_VERSION 1006 #define IDC_UNNOTIFY 1007 @@ -73,8 +75,6 @@ #define IDC_VIDEOTOSYSTEMMEM 1030 #define IDC_FIXTEXTOUT 1031 #define IDC_KEEPCURSORWITHIN 1032 -#define IDC_FIXTEXTOUT2 1032 -#define IDC_HOOKGLIDE 1032 #define IDC_USERGB565 1033 #define IDC_SUPPRESSDXERRORS 1034 #define IDC_PREVENTMAXIMIZE 1035 @@ -89,7 +89,6 @@ #define IDC_POSY 1047 #define IDC_SIZX 1048 #define IDC_SIZY 1049 -#define IDC_DISABLEFOGGING 1049 #define IDC_HOOKCHILDWIN 1050 #define IDC_MESSAGEPROC 1051 #define IDC_RECOVERSCREENMODE 1053 @@ -132,13 +131,11 @@ #define IDC_WINDOWIZE 1091 #define IDC_NOBANNER 1092 #define IDC_STARTDEBUG 1093 -#define IDC_PALETTECOLORS 1093 #define IDC_WIREFRAME 1094 #define IDC_DISABLEGAMMARAMP 1095 #define IDC_FORCEWINRESIZE 1096 #define IDC_FORCE16BPP 1097 #define IDC_FORCEHOOKOPENGL 1098 -#define IDC_LISTRES 1098 #define IDC_DESKTOPCENTER 1099 #define IDC_COORDINATES 1100 #define IDC_SUPPRESSD3DEXT 1101 @@ -211,6 +208,11 @@ #define IDC_SUPPORTSVGA 1170 #define IDC_SUPPORTHDMI 1171 #define IDC_NATIVERES 1172 +#define IDC_LISTRES 1173 +#define IDC_PALETTECOLORS 1174 +#define IDC_DISABLEFOGGING 1175 +#define IDC_RELEASEMOUSE 1176 +#define IDC_HOOKGLIDE 1177 #define ID_MODIFY 32771 #define ID_DELETE 32772 #define ID_ADD 32773 diff --git a/host/TabMouse.cpp b/host/TabInput.cpp similarity index 86% rename from host/TabMouse.cpp rename to host/TabInput.cpp index 6ff8090..b832fc9 100644 --- a/host/TabMouse.cpp +++ b/host/TabInput.cpp @@ -1,9 +1,9 @@ -// TabDirectX.cpp : implementation file +// TabInput.cpp : implementation file // #include "stdafx.h" #include "TargetDlg.h" -#include "TabMouse.h" +#include "TabInput.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -37,6 +37,7 @@ void CTabInput::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_MESSAGEPROC, cTarget->m_MessageProc); DDX_Check(pDX, IDC_FIXNCHITTEST, cTarget->m_FixNCHITTEST); DDX_Check(pDX, IDC_SLOW, cTarget->m_SlowDown); + DDX_Check(pDX, IDC_RELEASEMOUSE, cTarget->m_ReleaseMouse); // DirectInput DDX_Check(pDX, IDC_HOOKDI, cTarget->m_HookDI); DDX_Text(pDX, IDC_INITX, cTarget->m_InitX); @@ -45,6 +46,9 @@ void CTabInput::DoDataExchange(CDataExchange* pDX) DDX_Text(pDX, IDC_MAXY, cTarget->m_MaxY); DDX_Text(pDX, IDC_MINX, cTarget->m_MinX); DDX_Text(pDX, IDC_MINY, cTarget->m_MinY); + // Message processing + DDX_Check(pDX, IDC_FILTERMESSAGES, cTarget->m_FilterMessages); + DDX_Check(pDX, IDC_PEEKALLMESSAGES, cTarget->m_PeekAllMessages); } BEGIN_MESSAGE_MAP(CTabInput, CDialog) diff --git a/host/TabMouse.h b/host/TabInput.h similarity index 100% rename from host/TabMouse.h rename to host/TabInput.h diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp index 3f679d2..31cffe5 100644 --- a/host/TabProgram.cpp +++ b/host/TabProgram.cpp @@ -28,18 +28,17 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX) CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); DDX_Radio(pDX, IDC_COORDINATES, cTarget->m_Coordinates); DDX_Control(pDX, IDC_FILE, cTarget->m_File); + DDX_Control(pDX, IDC_LAUNCH, cTarget->m_Launch); DDX_Text(pDX, IDC_FILE, cTarget->m_FilePath); + DDX_Text(pDX, IDC_LAUNCH, cTarget->m_LaunchPath); DDX_Text(pDX, IDC_TITLE, cTarget->m_Title); DDX_Text(pDX, IDC_MODULE, cTarget->m_Module); DDX_Check(pDX, IDC_UNNOTIFY, cTarget->m_UnNotify); DDX_Check(pDX, IDC_WINDOWIZE, cTarget->m_Windowize); DDX_Check(pDX, IDC_HOOKDLLS, cTarget->m_HookDLLs); DDX_Check(pDX, IDC_FULLSCREENONLY, cTarget->m_FullScreenOnly); - DDX_Check(pDX, IDC_FILTERMESSAGES, cTarget->m_FilterMessages); - DDX_Check(pDX, IDC_PEEKALLMESSAGES, cTarget->m_PeekAllMessages); DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin); DDX_Check(pDX, IDC_HOOKENABLED, cTarget->m_HookEnabled); - DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner); DDX_Check(pDX, IDC_STARTDEBUG, cTarget->m_StartDebug); DDX_Check(pDX, IDC_CLIENTREMAPPING, cTarget->m_ClientRemapping); DDX_Check(pDX, IDC_SAVELOAD, cTarget->m_SaveLoad); @@ -56,6 +55,7 @@ BEGIN_MESSAGE_MAP(CTabProgram, CDialog) //{{AFX_MSG_MAP(CTabProgram) // NOTE: the ClassWizard will add message map macros here ON_BN_CLICKED(IDC_OPEN, OnOpen) + ON_BN_CLICKED(IDC_OPENLAUNCH, OnOpenLaunch) //}}AFX_MSG_MAP //ON_BN_CLICKED(IDC_COORDINATES, &CTabProgram::OnBnClickedCoordinates) //ON_BN_CLICKED(IDC_DESKTOPWORKAREA, &CTabProgram::OnBnClickedDesktopworkarea) @@ -75,6 +75,18 @@ void CTabProgram::OnOpen() "Program (*.exe)|*.exe|All Files (*.*)|*.*||", this); if( dlg.DoModal() == IDOK) cTarget->m_File.SetWindowText(dlg.GetPathName()); } + +void CTabProgram::OnOpenLaunch() +{ + // TODO: Please add your control notification handler code here + char path[MAX_PATH]; + CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); + cTarget->m_File.GetWindowText(path, MAX_PATH); + CFileDialog dlg( TRUE, "*.*", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, + "Program (*.exe)|*.exe|All Files (*.*)|*.*||", this); + if( dlg.DoModal() == IDOK) cTarget->m_Launch.SetWindowText(dlg.GetPathName()); +} + void CTabProgram::OnBnClickedCoordinates() { // TODO: Add your control notification handler code here diff --git a/host/TabProgram.h b/host/TabProgram.h index 3736072..4d62c72 100644 --- a/host/TabProgram.h +++ b/host/TabProgram.h @@ -17,6 +17,7 @@ class CTabProgram : public CDialog public: CTabProgram(CWnd* pParent = NULL); // standard constructor void OnOpen(void); + void OnOpenLaunch(void); // Dialog Data //{{AFX_DATA(CTabProgram) diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp index 813f0ae..7c95213 100644 --- a/host/TabWindow.cpp +++ b/host/TabWindow.cpp @@ -45,6 +45,7 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_NOWINDOWMOVE, cTarget->m_NoWindowMove); DDX_Check(pDX, IDC_SUPPRESSCHILD, cTarget->m_SuppressChild); DDX_Check(pDX, IDC_HIDEDESKTOP, cTarget->m_HideDesktop); + DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner); // color management DDX_Check(pDX, IDC_INIT8BPP, cTarget->m_Init8BPP); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 7fade23..2576586 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -126,6 +126,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_TimeStretch = FALSE; m_StretchTimers = FALSE; m_FineTiming = FALSE; + m_ReleaseMouse = FALSE; m_InterceptRDTSC = FALSE; m_HookOpenGL = FALSE; m_ForceHookOpenGL = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 9ee3898..7d806d7 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -23,6 +23,7 @@ public: enum { IDD = IDD_TARGET }; CDXTabCtrl m_tabdxTabCtrl; CEdit m_File; + CEdit m_Launch; int m_DXVersion; int m_Coordinates; int m_DxEmulationMode; @@ -54,6 +55,7 @@ public: BOOL m_StartDebug; BOOL m_HookEnabled; CString m_FilePath; + CString m_LaunchPath; CString m_Module; CString m_Title; CString m_OpenGLLib; @@ -107,6 +109,7 @@ public: BOOL m_TimeStretch; BOOL m_StretchTimers; BOOL m_FineTiming; + BOOL m_ReleaseMouse; BOOL m_InterceptRDTSC; BOOL m_HookOpenGL; BOOL m_ForceHookOpenGL; diff --git a/host/dxTabCtrl.cpp b/host/dxTabCtrl.cpp index 7d9666b..a8fd6f4 100644 --- a/host/dxTabCtrl.cpp +++ b/host/dxTabCtrl.cpp @@ -24,7 +24,7 @@ #include "TabProgram.h" #include "TabLogs.h" #include "TabDirectX.h" -#include "TabMouse.h" +#include "TabInput.h" #include "TabTiming.h" #include "TabWindow.h" #include "TabOpenGL.h" diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 2d9f5aaa5b0f3f02c06ee6c239abc4cb4fc5d7ae..e1d6693514f1cfb70c06e94c7e1a700e12752fb9 100644 GIT binary patch delta 3566 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 Sw;?b7fD}~?65oVU^#1{D;0Lw< delta 3731 zcmZ`(dr*|u6+hVFAU}O6wzr)QC>1CV)c~ z8x`>)mx!5|6s?n{MrWt-50e?4u~ReCT1}&p)K_An2n(9jR1GM-_uKtI9{px^?>)cY z?>xS9&;7h-l}(>2_nS28CIS_6mz!R9RaPwDqIYZc?%4)rCYm#l3 z0Ry!AfERLQ!IuI{aoY#88MN?~Pv}o)(80ecs@2o4OK@?X*=4m^L=wXsxFKOqqhpDC zNuJdzp;>T~=BQK1EuhJNNWj~)My)CPS`sd{*_OB+PGg}{D6=x*n-^i5T|#HW9SP-G z+#;I5n%$yE9?GE2fDQ?jsK!=Rcs!CB~8Q_tx z5Yb#-NKw92r!EVAlyK>#^78FAshI}77XAzLy`ynCk0sj9r$eUn@WhAt&&Z(9fTt27 zRc<%(QIlrPpwEP#s5d5+^a5RaEQT&P7Eb!aHkCZ{Aq^aP&J!I=iR%Y&8|@BvhRMCi zR^TkOSskE*Af&765{Uxog=0yn!RXTzm`j|p%3W-<7MVe(&B}rhr0>;^$54+xE@y$K z%H<@ujDA*HPka}|v%U<8e^2X{ACb57%TLJLz!jbHHrQP)Z{KxWJtOa@sU#l+(`#jTJPqYCz_u1%t*)x@W+kW2(aF7ggirc)#?7Z2njg zFdGc?+_vdxqTSnCrT^WYs5gEcK%Tnj)|yo8^t@A3uApOgC3;@kbt!=AgEb!OTNyzZ z?y1=yim{F&yBKgsvBl^cC4zu3mew^I>D*T3H2!VyA^(2>bzH+ATKh^gz0^2EQ($!F z6`RHJ>2zA1-<@6zkMTqt_;VnJ(=*NUc={*JiGiN_R>S-VC4}>w5fA_>2&4aKk0k(} zJMA-7iqsH*WMC&+$T+IKw}tR?JAUt_uzvpR06VOLD*93* zX~E6(ac8#D2#L7fmu6nqBrIpuDxAm;M`L)v2e6K=?plOP=^y!jE$!;c#-*Og-pR;) zZQV<7FKzA4qRCzbzRjW$7t!XfNWNWzxO8kVe8?jkq{#jKHDIT2^rlc{kBNKPdZv0F z_B;wxfI@1D>TRhhk(j_xf!WmFyM@MhBk9#%D?Ra8$!e4s$bK^h14C+Ir@z*|NvuGF zN|Bwu)@NcXLQqA|_x*x9sA%M~tx|wP&(=z7)bkuk9SK0}O^^cVa)&lNpIhx~X33C7 z3WL~#Fm<4r;+#fn_!-C?qM0&EoX>}8X1u7O6Z^-O`f8X8GhsA;1rE(I#9xX<>-r%eR+1Yixj9E3l| z#MAsRJ_`;5`w^&z?VyAu>`DY?pp}KH_>#}&^M$pk@G75jwtWn~Pe1Ncu^Ew=iC)D@+RvMYs)RBY9Wcdz?m&1iM;*|E8r%nxWg(19M1N(knz&3 zU3*vD+C=hU54$MVli#x*ev75yJ@OOd!<$IX0!!yZtf=9)+#1LV1m+EAm14CInM9Fl-07BhvCm~ z@vJJD4;;yJ|GpYzXLj(+B3Q@)S^I!a)ZRcgr&`~`% zTtPPd8W+d$$aQyRaoDKhPrS&s^>FdpAb<Wt!XURm- zaM4FzEq{izhC{cf5%%s3?kQ^WW)t?O`P@^yTG~R{GkR1{t%I-!PQUocYFVrqReZLJ zu<9*5jhfRl_}O*2cn4Ft@o*Eek2Yg`wJ^>%iuY9U-|wX`+80h;@GTyh-!p>Oa%7g& zRN=pG1TXySq&^D1VK~1Qgdk2W-a`oX4;O$aJxyw-;2THq!vA=-?0;ZX-do5!%$v4G zR9pW$S==;2EZ(nO;uSoZZ=SULRODwK-_-3C{(?u9z+dE7aQpU7ezx_z>ACz4t=vUe z(r%tv$&Cy3vZrQ*C;z6xqunweHG*&9k=1);K4t`8#`(YRCG4#R5^uRl02c3)#nB_g hJGgjpqs-Ti;Olv@-bUUtO5&4ixVVYR;vYtc{|DeH7(D<0 diff --git a/host/dxwndhost.h b/host/dxwndhost.h index 9dd2d45..3f4660c 100644 --- a/host/dxwndhost.h +++ b/host/dxwndhost.h @@ -22,6 +22,7 @@ typedef struct PRIVATEMAP { char title[40+1]; + char launchpath[MAX_PATH+1]; }PRIVATEMAP; ///////////////////////////////////////////////////////////////////////////// diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index b7b018c..4bf3ea7 100644 --- a/host/dxwndhost.rc +++ b/host/dxwndhost.rc @@ -259,8 +259,8 @@ BEGIN EDITTEXT IDC_FILE,39,31,162,14,ES_AUTOHSCROLL LTEXT "Path:",IDC_STATIC,11,33,22,9 PUSHBUTTON "...",IDC_OPEN,207,31,12,14 - EDITTEXT IDC_MODULE,39,49,161,14,ES_AUTOHSCROLL - LTEXT "Module:",IDC_STATIC,11,52,25,9 + EDITTEXT IDC_MODULE,39,65,161,14,ES_AUTOHSCROLL + LTEXT "Module:",IDC_STATIC,11,68,25,9 LTEXT "Window initial position && size",IDC_STATIC,18,198,115,9 LTEXT "X",IDC_STATIC,18,214,9,9 LTEXT "Y",IDC_STATIC,49,214,9,9 @@ -270,27 +270,27 @@ BEGIN EDITTEXT IDC_POSY,55,210,19,14,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT EDITTEXT IDC_SIZX,85,210,19,14,ES_AUTOHSCROLL,WS_EX_RIGHT EDITTEXT IDC_SIZY,113,210,19,14,ES_AUTOHSCROLL,WS_EX_RIGHT - CONTROL "Do not notify on task switch",IDC_UNNOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,93,124,10 - CONTROL "Optimize CPU (DirectX1 - 7)",IDC_SAVELOAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,129,109,10 - CONTROL "Intercept Alt-F4 key",IDC_HANDLEALTF4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,105,109,10 - CONTROL "Run in Window",IDC_WINDOWIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,117,124,10 - GROUPBOX "Generic",IDC_STATIC,7,65,286,106 - CONTROL "No banner",IDC_NOBANNER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,93,108,10 - CONTROL "use DLL Injection",IDC_STARTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,105,100,10 - CONTROL "Remap Client Rect",IDC_CLIENTREMAPPING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,81,115,10 - CONTROL "Hook all DLLs",IDC_HOOKDLLS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,129,124,10 - CONTROL "Hook enabled",IDC_HOOKENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,81,124,10 + CONTROL "Do not notify on task switch",IDC_UNNOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,105,124,10 + CONTROL "Optimize CPU (DirectX1 - 7)",IDC_SAVELOAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,141,109,10 + CONTROL "Intercept Alt-F4 key",IDC_HANDLEALTF4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,117,109,10 + CONTROL "Run in Window",IDC_WINDOWIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,129,124,10 + GROUPBOX "Generic",IDC_STATIC,7,82,286,89 + CONTROL "use DLL Injection",IDC_STARTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,117,100,10 + CONTROL "Remap Client Rect",IDC_CLIENTREMAPPING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,93,115,10 + CONTROL "Hook all DLLs",IDC_HOOKDLLS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,141,124,10 + CONTROL "Hook enabled",IDC_HOOKENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,93,124,10 CONTROL "X,Y coordinates",IDC_COORDINATES,"Button",BS_AUTORADIOBUTTON | WS_GROUP,170,184,95,10 CONTROL "Desktop center",IDC_DESKTOPCENTER,"Button",BS_AUTORADIOBUTTON,170,194,95,10 CONTROL "Desktop work area",IDC_DESKTOPWORKAREA,"Button",BS_AUTORADIOBUTTON,170,204,95,10 CONTROL "Desktop",IDC_DESKTOPFULL,"Button",BS_AUTORADIOBUTTON,170,214,95,10 - CONTROL "Hook child WindowProc",IDC_HOOKCHILDWIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,117,104,10 - CONTROL "Fullscreen only",IDC_FULLSCREENONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,141,114,10 - CONTROL "Filter offending messages",IDC_FILTERMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,153,114,10 - CONTROL "Peek all messages in queue",IDC_PEEKALLMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,153,114,10 + CONTROL "Hook child WindowProc",IDC_HOOKCHILDWIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,129,104,10 + CONTROL "Fullscreen only",IDC_FULLSCREENONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,153,114,10 GROUPBOX "Position",IDC_STATIC,7,172,286,56 CONTROL "Keep aspect ratio",IDC_KEEPASPECTRATIO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,185,115,10 - CONTROL "Hook OpenGL",IDC_HOOKOPENGL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,141,115,10 + CONTROL "Hook OpenGL",IDC_HOOKOPENGL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,153,115,10 + EDITTEXT IDC_LAUNCH,39,48,162,14,ES_AUTOHSCROLL + LTEXT "Launch:",IDC_STATIC,11,51,28,9 + PUSHBUTTON "...",IDC_OPENLAUNCH,207,48,12,14 END IDD_TAB_LOG DIALOGEX 0, 0, 300, 240 @@ -360,7 +360,7 @@ BEGIN CONTROL "Hide Cursor",IDC_HIDEHWCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,15,100,10 CONTROL "Intercept GDI Cursor Clipping",IDC_ENABLECLIPPING, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,85,109,10 - GROUPBOX "Cursor handling",IDC_STATIC,7,3,129,134 + GROUPBOX "Cursor handling",IDC_STATIC,7,3,129,148 CONTROL "Keep cursor within window",IDC_KEEPCURSORWITHIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,61,108,10 CONTROL "Force cursor clipping",IDC_CLIPCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,50,108,10 CONTROL "Message processing",IDC_MESSAGEPROC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,96,103,10 @@ -385,6 +385,10 @@ BEGIN CONTROL "DirectInput Hooking",IDC_HOOKDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,15,97,12 GROUPBOX "DirectInput",IDC_STATIC,141,3,152,71 LTEXT " X,Y range",IDC_STATIC,147,54,42,9 + CONTROL "Filter offending messages",IDC_FILTERMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,96,114,10 + CONTROL "Peek all messages in queue",IDC_PEEKALLMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,108,114,10 + GROUPBOX "Message handling",IDC_STATIC,142,79,151,72 + CONTROL "Release mouse outside window",IDC_RELEASEMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,130,114,12 END IDD_TAB_TIMING DIALOGEX 0, 0, 300, 240 @@ -443,6 +447,7 @@ BEGIN CONTROL "SVGA modes",IDC_SUPPORTSVGA,"Button",BS_AUTORADIOBUTTON | WS_GROUP,160,136,124,10 CONTROL "HDMI modes",IDC_SUPPORTHDMI,"Button",BS_AUTORADIOBUTTON,160,148,124,10 CONTROL "Monitor native modes",IDC_NATIVERES,"Button",BS_AUTORADIOBUTTON,160,160,124,10 + CONTROL "No banner",IDC_NOBANNER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,196,108,10 END IDD_TAB_EMPTY DIALOGEX 0, 0, 300, 240 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 4b1c5360acc4a5c0de31231fcdd69e7f5bcd73d8..fe7b07d67bcd84d3345101f849401432e1c2d930 100644 GIT binary patch delta 5404 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 diff --git a/host/dxwndhost.vs2008.vcproj b/host/dxwndhost.vs2008.vcproj index a3532ac..9f3c46b 100644 --- a/host/dxwndhost.vs2008.vcproj +++ b/host/dxwndhost.vs2008.vcproj @@ -394,11 +394,11 @@ > m_TimeStretch) t->flags2 |= TIMESTRETCH; if(dlg->m_StretchTimers) t->flags4 |= STRETCHTIMERS; if(dlg->m_FineTiming) t->flags4 |= FINETIMING; + if(dlg->m_ReleaseMouse) t->flags4 |= RELEASEMOUSE; if(dlg->m_InterceptRDTSC) t->flags4 |= INTERCEPTRDTSC; if(dlg->m_HookOpenGL) t->flags2 |= HOOKOPENGL; if(dlg->m_ForceHookOpenGL) t->flags3 |= FORCEHOOKOPENGL; @@ -404,6 +405,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_TimeStretch = t->flags2 & TIMESTRETCH ? 1 : 0; dlg->m_StretchTimers = t->flags4 & STRETCHTIMERS ? 1 : 0; dlg->m_FineTiming = t->flags4 & FINETIMING ? 1 : 0; + dlg->m_ReleaseMouse = t->flags4 & RELEASEMOUSE ? 1 : 0; dlg->m_InterceptRDTSC = t->flags4 & INTERCEPTRDTSC ? 1 : 0; dlg->m_HookOpenGL = t->flags2 & HOOKOPENGL ? 1 : 0; dlg->m_ForceHookOpenGL = t->flags3 & FORCEHOOKOPENGL ? 1 : 0; @@ -436,13 +438,15 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_MaxScreenRes = t->MaxScreenRes; } -static void SaveConfigItem(TARGETMAP *TargetMap, char *Title, int i, char *InitPath) +static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, char *InitPath) { char key[32], val[32]; sprintf_s(key, sizeof(key), "title%i", i); - WritePrivateProfileString("target", key, Title, InitPath); + WritePrivateProfileString("target", key, PrivateMap->title, InitPath); sprintf_s(key, sizeof(key), "path%i", i); WritePrivateProfileString("target", key, TargetMap->path, InitPath); + sprintf_s(key, sizeof(key), "launchpath%i", i); + WritePrivateProfileString("target", key, PrivateMap->launchpath, InitPath); sprintf_s(key, sizeof(key), "module%i", i); WritePrivateProfileString("target", key, TargetMap->module, InitPath); sprintf_s(key, sizeof(key), "opengllib%i", i); @@ -518,6 +522,8 @@ static void ClearTarget(int i, char *InitPath) char key[32]; sprintf_s(key, sizeof(key), "path%i", i); WritePrivateProfileString("target", key, 0, InitPath); + sprintf_s(key, sizeof(key), "launchpath%i", i); + WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "ver%i", i); WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "coord%i", i); @@ -563,7 +569,7 @@ static void ClearTarget(int i, char *InitPath) WritePrivateProfileString("target", key, 0, InitPath); } -static int LoadConfigItem(TARGETMAP *TargetMap, char *Title, int i, char *InitPath) +static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, char *InitPath) { char key[32]; DWORD flags; @@ -571,8 +577,10 @@ static int LoadConfigItem(TARGETMAP *TargetMap, char *Title, int i, char *InitPa sprintf_s(key, sizeof(key), "path%i", i); GetPrivateProfileString("target", key, "", TargetMap->path, MAX_PATH, InitPath); if(!TargetMap->path[0]) return FALSE; + sprintf_s(key, sizeof(key), "launchpath%i", i); + GetPrivateProfileString("target", key, "", PrivateMap->launchpath, MAX_PATH, InitPath); sprintf_s(key, sizeof(key), "title%i", i); - GetPrivateProfileString("target", key, "", Title, sizeof(PRIVATEMAP)-1, InitPath); + GetPrivateProfileString("target", key, "", PrivateMap->title, sizeof(PRIVATEMAP)-1, InitPath); sprintf_s(key, sizeof(key), "module%i", i); GetPrivateProfileString("target", key, "", TargetMap->module, sizeof(TargetMap->module)-1, InitPath); sprintf_s(key, sizeof(key), "opengllib%i", i); @@ -665,7 +673,7 @@ void CDxwndhostView::SaveConfigFile() for(i = 0; i < MAXTARGETS; i ++){ if(!TargetMaps[i].path[0]) break; - SaveConfigItem(&TargetMaps[i], TitleMaps[i].title, i, InitPath); + SaveConfigItem(&TargetMaps[i], &TitleMaps[i], i, InitPath); } for(; i < MAXTARGETS; i ++) ClearTarget(i, InitPath); this->isUpdated=FALSE; @@ -757,7 +765,7 @@ void CDxwndhostView::OnInitialUpdate() listctrl.InsertColumn(0, &listcol); for(i = 0; i < MAXTARGETS; i ++){ - if (!LoadConfigItem(&TargetMaps[i], TitleMaps[i].title, i, InitPath)) break; + if (!LoadConfigItem(&TargetMaps[i], &TitleMaps[i], i, InitPath)) break; listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; @@ -821,7 +829,7 @@ void CDxwndhostView::OnExport() CFileDialog dlg( FALSE, "*.dxw", path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "dxwnd task config (*.dxw)|*.dxw|All Files (*.*)|*.*||", this); if( dlg.DoModal() == IDOK) - SaveConfigItem(&TargetMaps[i], TitleMaps[i].title, 0, dlg.GetPathName().GetBuffer()); + SaveConfigItem(&TargetMaps[i], &TitleMaps[i], 0, dlg.GetPathName().GetBuffer()); } void CDxwndhostView::OnImport() @@ -849,7 +857,7 @@ void CDxwndhostView::OnImport() if(buffer[ofn.nFileOffset - 1] != '\0'){ // Single-Select // "buffer" - name of file - LoadConfigItem(&TargetMaps[i], TitleMaps[i].title, 0, buffer); + LoadConfigItem(&TargetMaps[i], &TitleMaps[i], 0, buffer); listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; @@ -868,7 +876,7 @@ void CDxwndhostView::OnImport() if(!*p)break; strcpy(pathname, folder); strcat(pathname, p); - LoadConfigItem(&TargetMaps[i], TitleMaps[i].title, 0, pathname); + LoadConfigItem(&TargetMaps[i], &TitleMaps[i], 0, pathname); listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; @@ -897,9 +905,11 @@ void CDxwndhostView::OnModify() pos = listctrl.GetFirstSelectedItemPosition(); i = listctrl.GetNextSelectedItem(pos); dlg.m_Title = TitleMaps[i].title; + dlg.m_LaunchPath = TitleMaps[i].launchpath; SetDlgFromTarget(&TargetMaps[i], &dlg); if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ strncpy(TitleMaps[i].title, dlg.m_Title, 40); + strncpy(TitleMaps[i].launchpath, dlg.m_LaunchPath, MAX_PATH); SetTargetFromDlg(&TargetMaps[i], &dlg); CListCtrl& listctrl = GetListCtrl(); listitem.mask = LVIF_TEXT | LVIF_IMAGE; @@ -1203,6 +1213,7 @@ void CDxwndhostView::OnAdd() memset(&TargetMaps[i],0,sizeof(TARGETMAP)); // clean up, just in case.... if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ strncpy(TitleMaps[i].title, dlg.m_Title, 40); + strncpy(TitleMaps[i].launchpath, dlg.m_LaunchPath, MAX_PATH); SetTargetFromDlg(&TargetMaps[i], &dlg); CListCtrl& listctrl = GetListCtrl(); listitem.mask = LVIF_TEXT | LVIF_IMAGE; @@ -1641,6 +1652,12 @@ void CDxwndhostView::OnRun() if(!listctrl.GetSelectedCount()) return; pos = listctrl.GetFirstSelectedItemPosition(); i = listctrl.GetNextSelectedItem(pos); + + //if(strlen(TitleMaps[i].launchpath)>0){ + // system(TitleMaps[i].launchpath); + // return; + //} + ZeroMemory(&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); strcpy_s(path, sizeof(path), TargetMaps[i].path); @@ -1650,7 +1667,9 @@ void CDxwndhostView::OnRun() CreateThread( NULL, 0, StartDebug, &TargetMaps[i], 0, NULL); } else{ - CreateProcess(NULL, TargetMaps[i].path, 0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, path, &sinfo, &pinfo); + CreateProcess(NULL, + (strlen(TitleMaps[i].launchpath)>0) ? TitleMaps[i].launchpath: TargetMaps[i].path, + 0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, path, &sinfo, &pinfo); } }