diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index 9bed8ebc98..06429e8a07 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -206,6 +206,52 @@ namespace } } + //============================================================================== + static HHOOK keyboardHook = 0; + static int keyboardHookUsers = 0; + + LRESULT CALLBACK keyboardHookCallback (int nCode, WPARAM wParam, LPARAM lParam) + { + if (nCode == 0) + { + const MSG& msg = *(const MSG*) lParam; + + if (msg.message == WM_CHAR) + { + Desktop& desktop = Desktop::getInstance(); + HWND focused = GetFocus(); + + for (int i = desktop.getNumComponents(); --i >= 0;) + { + if ((HWND) desktop.getComponent (i)->getWindowHandle() == focused) + { + SendMessage (focused, msg.message, msg.wParam, msg.lParam); + break; + } + } + } + } + + return CallNextHookEx (mouseWheelHook, nCode, wParam, lParam); + } + + void registerKeyboardHook() + { + if (keyboardHookUsers++ == 0) + keyboardHook = SetWindowsHookEx (WH_GETMESSAGE, keyboardHookCallback, + (HINSTANCE) Process::getCurrentModuleInstanceHandle(), + GetCurrentThreadId()); + } + + void unregisterKeyboardHook() + { + if (--keyboardHookUsers == 0 && keyboardHook != 0) + { + UnhookWindowsHookEx (keyboardHook); + keyboardHook = 0; + } + } + #if JUCE_WINDOWS static bool messageThreadIsDefinitelyCorrect = false; #endif @@ -1291,6 +1337,9 @@ public: addMouseListener (this, true); registerMouseWheelHook(); + + if (PluginHostType().isAbletonLive()) + registerKeyboardHook(); #endif } @@ -1298,6 +1347,7 @@ public: { #if JUCE_WINDOWS unregisterMouseWheelHook(); + unregisterKeyboardHook(); #endif deleteAllChildren(); // note that we can't use a ScopedPointer because the editor may