From: Václav Slavík Date: Mon, 17 Dec 2001 00:28:31 +0000 (+0000) Subject: making wxMSW MSLU(unicows)-friendly X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/eb5e4d9ac1527441fe107460c7fee93092175a3e making wxMSW MSLU(unicows)-friendly git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index 25d0b5d786..1e364e4b3c 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -391,6 +391,9 @@ WXDLLEXPORT extern wxString wxGetWindowClass(WXHWND hWnd); // is, for mainly historical reasons, signed) WXDLLEXPORT extern WXWORD wxGetWindowId(WXHWND hWnd); +// check if hWnd's WNDPROC is wndProc. Return true if yes, false if they are different +extern bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc); + // Does this window style specify any border? inline bool wxStyleHasBorder(long style) { diff --git a/src/msw/app.cpp b/src/msw/app.cpp index c59675e7f6..480bb9b54d 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -195,7 +195,7 @@ bool wxApp::Initialize() // the first thing to do is to check if we're trying to run an Unicode // program under Win9x - if so, abort right now as it has no chance to // work -#if wxUSE_UNICODE +#if wxUSE_UNICODE && !wxUSE_UNICODE_MSLU if ( wxGetOsVersion() != wxWINDOWS_NT ) { // note that we can use MessageBoxW() as it's implemented even under @@ -204,14 +204,14 @@ bool wxApp::Initialize() ::MessageBox ( NULL, - _T("This program uses Unicode and requires Windows NT/2000.\nProgram aborted."), + _T("This program uses Unicode and requires Windows NT/2000/XP.\nProgram aborted."), _T("wxWindows Fatal Error"), MB_ICONERROR | MB_OK ); return FALSE; } -#endif // wxUSE_UNICODE +#endif // wxUSE_UNICODE && !wxUSE_UNICODE_MSLU // Some people may wish to use this, but // probably it shouldn't be here by default. diff --git a/src/msw/fdrepdlg.cpp b/src/msw/fdrepdlg.cpp index 13c4062c8c..5cc89364cd 100644 --- a/src/msw/fdrepdlg.cpp +++ b/src/msw/fdrepdlg.cpp @@ -197,10 +197,9 @@ void wxFindReplaceDialogImpl::SubclassDialog(HWND hwnd) // check that we don't subclass the parent twice: this would be a bad idea // as then we'd have infinite recursion in wxFindReplaceWindowProc - WNDPROC oldParentWndProc = (WNDPROC)::GetWindowLong(hwnd, GWL_WNDPROC); - - if ( oldParentWndProc != wxFindReplaceWindowProc ) + if ( !wxCheckWindowWndProc((WXHWND)hwnd, (WXFARPROC)wxFindReplaceWindowProc) ) { + WNDPROC oldParentWndProc = (WNDPROC)::GetWindowLong(hwnd, GWL_WNDPROC); // save old wnd proc elsewhere to access it from // wxFindReplaceWindowProc m_oldParentWndProc = oldParentWndProc; diff --git a/src/msw/window.cpp b/src/msw/window.cpp index dd98fe4c43..4cfa88b3c9 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -968,11 +968,11 @@ void wxWindowMSW::SubclassWin(WXHWND hWnd) wxAssociateWinWithHandle(hwnd, this); - m_oldWndProc = (WXFARPROC)::GetWindowLong(hwnd, GWL_WNDPROC); - + m_oldWndProc = (WXFARPROC)::GetWindowLong((HWND)hWnd, GWL_WNDPROC); + // we don't need to subclass the window of our own class (in the Windows // sense of the word) - if ( (WXFARPROC) m_oldWndProc != (WXFARPROC) wxWndProc ) + if ( !wxCheckWindowWndProc(hWnd, (WXFARPROC)wxWndProc) ) { ::SetWindowLong(hwnd, GWL_WNDPROC, (LONG) wxWndProc); } @@ -997,8 +997,7 @@ void wxWindowMSW::UnsubclassWin() if ( m_oldWndProc ) { - FARPROC wndProc = (FARPROC)::GetWindowLong(hwnd, GWL_WNDPROC); - if ( wndProc != (FARPROC) m_oldWndProc ) + if ( !wxCheckWindowWndProc((WXHWND)hwnd, m_oldWndProc) ) { ::SetWindowLong(hwnd, GWL_WNDPROC, (LONG) m_oldWndProc); } @@ -1008,6 +1007,35 @@ void wxWindowMSW::UnsubclassWin() } } +bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc) +{ +#if wxUSE_UNICODE_MSLU + // VS: We can't use GetWindowLong(hwnd, GWL_WNDPROC) together with unicows.dll + // because it doesn't return pointer to the real wnd proc but rather a handle + // of a fake proc that does Unicode<->ANSI translation. + // + // The hack bellow works, because WNDCLASS contains original window handler + // rather that the unicows fake one. This may not be on purpose, though; if + // it stops working with future versions of unicows.dll, we can override + // unicows hooks by setting Unicows_{Set,Get}WindowLong and + // Unicows_RegisterClass to our own versions that keep track of + // fake<->real wnd proc mapping. + // + // FIXME: Doesn't handle wnd procs set by SetWindowLong, only these set + // with RegisterClass!! + + static wxChar buffer[512]; + WNDCLASS cls; + + ::GetClassName((HWND)hWnd, buffer, 512); + ::GetClassInfo(wxGetInstance(), buffer, &cls); + return wndProc == (WXFARPROC)cls.lpfnWndProc; +#else + return wndProc == (WXFARPROC)::GetWindowLong((HWND)hWnd, GWL_WNDPROC); +#endif +} + + // Make a Windows extended style from the given wxWindows window style WXDWORD wxWindowMSW::MakeExtendedStyle(long style, bool eliminateBorders) {