From 099e36630b3fcf89b5ce4e529b8c6ff7b2fddf97 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 21 Mar 2009 16:12:21 +0000 Subject: [PATCH] fix generation of wxEVT_CHAR_HOOK events [backport of r59700 from trunk] git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@59701 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 5 +++++ src/msw/window.cpp | 45 ++++++++++++++++++++++++--------------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 787221dba5..0c711a8f7c 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -95,6 +95,11 @@ All (GUI): - Add wxBU_EXACTFIT support to wxToggleButton XRC handler (Ronny Krueger). +wxMSW: + +- Fixed generation of wxEVT_CHAR_HOOK events. + + 2.8.10: ------- diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 1fb2960a89..4dad0af65f 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -6131,28 +6131,8 @@ extern wxWindow *wxGetWindowFromHWND(WXHWND hWnd) // Windows keyboard hook. Allows interception of e.g. F1, ESCAPE // in active frames and dialogs, regardless of where the focus is. static HHOOK wxTheKeyboardHook = 0; -static FARPROC wxTheKeyboardHookProc = 0; -int APIENTRY _EXPORT -wxKeyboardHook(int nCode, WORD wParam, DWORD lParam); -void wxSetKeyboardHook(bool doIt) -{ - if ( doIt ) - { - wxTheKeyboardHookProc = MakeProcInstance((FARPROC) wxKeyboardHook, wxGetInstance()); - wxTheKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) wxTheKeyboardHookProc, wxGetInstance(), - - GetCurrentThreadId() - // (DWORD)GetCurrentProcess()); // This is another possibility. Which is right? - ); - } - else - { - UnhookWindowsHookEx(wxTheKeyboardHook); - } -} - -int APIENTRY _EXPORT +int APIENTRY wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) { DWORD hiWord = HIWORD(lParam); @@ -6196,6 +6176,29 @@ wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) return (int)CallNextHookEx(wxTheKeyboardHook, nCode, wParam, lParam); } +void wxSetKeyboardHook(bool doIt) +{ + if ( doIt ) + { + wxTheKeyboardHook = ::SetWindowsHookEx + ( + WH_KEYBOARD, + (HOOKPROC)wxKeyboardHook, + NULL, // must be NULL for process hook + ::GetCurrentThreadId() + ); + if ( !wxTheKeyboardHook ) + { + wxLogLastError(_T("SetWindowsHookEx(wxKeyboardHook)")); + } + } + else // uninstall + { + if ( wxTheKeyboardHook ) + ::UnhookWindowsHookEx(wxTheKeyboardHook); + } +} + #endif // !__WXMICROWIN__ #ifdef __WXDEBUG__