diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c
index 27b31a1..4feb3d5 100644
--- a/dlls/user32/winproc.c
+++ b/dlls/user32/winproc.c
@@ -2257,7 +2257,17 @@ LRESULT WINAPI CallWindowProcA(
if (!func) return 0;
- if (!(proc = handle_to_proc( func )) && !(proc = find_builtin_proc( func
)))
+ /* for built-in procs we do as if the second item was a thunk */
+ if ((proc = find_builtin_proc( func )) != NULL)
+ {
+ if (func == proc->procA || !IsWindowUnicode( hwnd ))
+ call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
+ else
+ call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
+ return result;
+ }
+
+ if (!(proc = handle_to_proc( func )))
call_window_proc( hwnd, msg, wParam, lParam, &result, func );
else if (proc->procA)
call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
@@ -2281,8 +2291,18 @@ LRESULT WINAPI CallWindowProcW( WNDPROC func, HWND hwnd,
UINT msg,
LRESULT result;
if (!func) return 0;
+
+ /* for built-in procs we do as if the second item was a thunk */
+ if ((proc = find_builtin_proc( func )) != NULL)
+ {
+ if (func == proc->procW || IsWindowUnicode( hwnd ))
+ call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
+ else
+ call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
+ return result;
+ }
- if (!(proc = handle_to_proc( func )) && !(proc = find_builtin_proc( func
)))
+ if (!(proc = handle_to_proc( func )))
call_window_proc( hwnd, msg, wParam, lParam, &result, func );
else if (proc->procW)
call_window_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
@@ -2340,7 +2360,17 @@ INT_PTR WINPROC_CallDlgProcA( DLGPROC func, HWND hwnd,
UINT msg, WPARAM wParam,
if (!func) return 0;
- if (!(proc = handle_to_proc( func )) && !(proc = find_builtin_proc( func
)))
+ /* for built-in procs we do as if the second item was a thunk */
+ if ((proc = find_builtin_proc( func )) != NULL)
+ {
+ if (func == proc->procA || !IsWindowUnicode( hwnd ))
+ call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
+ else
+ call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
+ return result;
+ }
+
+ if (!(proc = handle_to_proc( func )))
ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, func );
else if (proc->procA)
ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procA
);
@@ -2368,8 +2398,18 @@ INT_PTR WINPROC_CallDlgProcW( DLGPROC func, HWND hwnd,
UINT msg, WPARAM wParam,
INT_PTR ret;
if (!func) return 0;
+
+ /* for built-in procs we do as if the second item was a thunk */
+ if ((proc = find_builtin_proc( func )) != NULL)
+ {
+ if (func == proc->procW || IsWindowUnicode( hwnd ))
+ call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
+ else
+ call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
+ return result;
+ }