diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 507a36a6c6f..aa71c8eac05 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -876,6 +876,7 @@ BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, WND *wndPtr; WNDPROC func; WINDOWPROC *proc; + BOOL unicode_win; if (!(wndPtr = WIN_GetPtr( hwnd ))) return FALSE; if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return FALSE; @@ -886,10 +887,9 @@ BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, } func = wndPtr->winproc; proc = handle_to_proc( wndPtr->winproc ); + unicode_win = wndPtr->flags & WIN_ISUNICODE; WIN_ReleasePtr( wndPtr ); - if (!proc) return TRUE; - if (thread_info->recursion_count > MAX_WINPROC_RECURSION) return FALSE; thread_info->recursion_count++; @@ -897,19 +897,27 @@ BOOL WINPROC_call_window( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, { if (proc == WINPROC_PROC16) WINPROC_CallProcWtoA( wow_handlers.call_window_proc, hwnd, msg, wParam, lParam, result, func ); - else if (proc->procW) + else if (proc && proc->procW) call_window_proc( hwnd, msg, wParam, lParam, result, proc->procW ); - else + else if (proc) WINPROC_CallProcWtoA( call_window_proc, hwnd, msg, wParam, lParam, result, proc->procA ); + else if (unicode_win) + call_window_proc( hwnd, msg, wParam, lParam, result, func ); + else + WINPROC_CallProcWtoA( call_window_proc, hwnd, msg, wParam, lParam, result, func ); } else { if (proc == WINPROC_PROC16) wow_handlers.call_window_proc( hwnd, msg, wParam, lParam, result, func ); - else if (proc->procA) + else if (proc && proc->procA) call_window_proc( hwnd, msg, wParam, lParam, result, proc->procA ); - else + else if (proc) WINPROC_CallProcAtoW( call_window_proc, hwnd, msg, wParam, lParam, result, proc->procW, mapping ); + else if (unicode_win) + WINPROC_CallProcAtoW( call_window_proc, hwnd, msg, wParam, lParam, result, func, mapping ); + else + call_window_proc( hwnd, msg, wParam, lParam, result, func ); } thread_info->recursion_count--; return TRUE;