diff --git a/modules/highgui/src/window_w32.cpp b/modules/highgui/src/window_w32.cpp index 716af1094c..43a19baf89 100644 --- a/modules/highgui/src/window_w32.cpp +++ b/modules/highgui/src/window_w32.cpp @@ -278,6 +278,21 @@ std::shared_ptr icvFindWindowByName(const char* name) return icvFindWindowByName(std::string(name)); } +// Mutex must be locked +static +std::shared_ptr icvFindWindowByHandle(HWND hwnd) +{ + auto& g_windows = getWindowsList(); + for (auto it = g_windows.begin(); it != g_windows.end(); ++it) + { + auto window = *it; + if (!window) + continue; + if (window->hwnd == hwnd || window->frame == hwnd) + return window; + } + return std::shared_ptr(); +} static LRESULT CALLBACK HighGUIProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -2187,22 +2202,15 @@ static void showSaveDialog(CvWindow& window) */ static bool handleMessage(MSG& message, int& keyCode) { - // whether we have to call translate and dispatch yet - // otherwise the message was handled specifically - bool is_processed = false; - - AutoLock lock(getWindowMutex()); - auto& g_windows = getWindowsList(); - for (auto it = g_windows.begin(); it != g_windows.end() && !is_processed; ++it) + std::shared_ptr window_; + { + AutoLock lock(getWindowMutex()); + window_ = icvFindWindowByHandle(message.hwnd); + } + if (window_) { - auto window_ = *it; - if (!window_) - continue; CvWindow& window = *window_; - if (!(window.hwnd == message.hwnd || window.frame == message.hwnd)) - continue; - is_processed = true; switch (message.message) { case WM_DESTROY: @@ -2215,7 +2223,6 @@ static bool handleMessage(MSG& message, int& keyCode) case WM_SYSKEYDOWN: if (message.wParam == VK_F10) { - is_processed = true; keyCode = (int)(message.wParam << 16); return true; } @@ -2245,7 +2252,6 @@ static bool handleMessage(MSG& message, int& keyCode) message.wParam == VK_PRIOR || message.wParam == VK_NEXT) { DispatchMessage(&message); - is_processed = true; keyCode = (int)(message.wParam << 16); return true; } @@ -2254,18 +2260,16 @@ static bool handleMessage(MSG& message, int& keyCode) default: DispatchMessage(&message); - is_processed = true; break; } } - - if (!is_processed) + else { TranslateMessage(&message); DispatchMessage(&message); } - return false; // no value to return, keep processing + return false; // no keyCode to return, keep processing } /*