--- old/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp 2020-08-28 16:54:34.000000000 +0100 +++ new/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp 2020-08-28 16:54:33.000000000 +0100 @@ -3211,10 +3211,20 @@ * instead of SendMessage(). */ LRESULT AwtToolkit::InvokeInputMethodFunction(UINT msg, WPARAM wParam, LPARAM lParam) { - CriticalSection::Lock lock(m_inputMethodLock); - if (PostMessage(msg, wParam, lParam)) { - ::WaitForSingleObject(m_inputMethodWaitEvent, INFINITE); - return m_inputMethodData; + /* + * DND runs on the main thread. So it is necessary to use SendMessage() to call an IME + * function once the DND is active; otherwise a hang is possible since DND may wait for + * the IME completion. + */ + if (isInDoDragDropLoop) { + return SendMessage(msg, wParam, lParam); + } else { + CriticalSection::Lock lock(m_inputMethodLock); + if (PostMessage(msg, wParam, lParam)) { + ::WaitForSingleObject(m_inputMethodWaitEvent, INFINITE); + return m_inputMethodData; + } + return 0; } - return 0; } +