3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS user32.dll
5 * FILE: win32ss/user/user32/windows/defwnd.c
6 * PURPOSE: Window management
7 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
9 * 06-06-2001 CSH Created
12 /* INCLUDES ******************************************************************/
16 #include <wine/debug.h>
17 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
19 /* GLOBALS *******************************************************************/
21 /* FUNCTIONS *****************************************************************/
29 GetSysColor(int nIndex
)
31 if(nIndex
>= 0 && nIndex
< NUM_SYSCOLORS
)
33 return gpsi
->argbSystem
[nIndex
];
36 SetLastError(ERROR_INVALID_PARAMETER
);
46 GetSysColorBrush(int nIndex
)
48 if(nIndex
>= 0 && nIndex
< NUM_SYSCOLORS
)
50 return gpsi
->ahbrSystem
[nIndex
];
53 SetLastError(ERROR_INVALID_PARAMETER
);
64 CONST INT
*lpaElements
,
65 CONST COLORREF
*lpaRgbValues
)
67 return NtUserSetSysColors(cElements
, lpaElements
, lpaRgbValues
, 0);
72 DefSetText(HWND hWnd
, PCWSTR String
, BOOL Ansi
)
75 LARGE_STRING lsString
;
80 RtlInitLargeAnsiString((PLARGE_ANSI_STRING
)&lsString
, (PCSZ
)String
, 0);
82 RtlInitLargeUnicodeString((PLARGE_UNICODE_STRING
)&lsString
, String
, 0);
84 Ret
= NtUserDefSetText(hWnd
, (String
? &lsString
: NULL
));
90 IntFindChildWindowToOwner(HWND hRoot
, HWND hOwner
)
93 PWND Child
, OwnerWnd
, Root
, Owner
;
95 Root
= ValidateHwnd(hRoot
);
96 Owner
= ValidateHwnd(hOwner
);
98 for( Child
= Root
->spwndChild
? DesktopPtrToUser(Root
->spwndChild
) : NULL
;
100 Child
= Child
->spwndNext
? DesktopPtrToUser(Child
->spwndNext
) : NULL
)
102 OwnerWnd
= Child
->spwndOwner
? DesktopPtrToUser(Child
->spwndOwner
) : NULL
;
106 if (!(Child
->style
& WS_POPUP
) || !(Child
->style
& WS_VISIBLE
))
109 if(OwnerWnd
== Owner
)
115 ERR("IDCWTO Nothing found\n");
119 /***********************************************************************
120 * DefWndTrackScrollBar
122 * Track a mouse button press on the horizontal or vertical scroll-bar.
125 DefWndTrackScrollBar(HWND Wnd
, WPARAM wParam
, POINT Pt
)
129 if (SC_HSCROLL
== (wParam
& 0xfff0))
131 if (HTHSCROLL
!= (wParam
& 0x0f))
137 else /* SC_VSCROLL */
139 if (HTVSCROLL
!= (wParam
& 0x0f))
145 ScrollTrackScrollBar(Wnd
, ScrollBar
, Pt
);
148 LRESULT WINAPI
DoAppSwitch( WPARAM wParam
, LPARAM lParam
);
151 DefWndHandleSysCommand(HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
156 if (!IsWindowEnabled( hWnd
)) return 0;
158 switch (wParam
& 0xfff0)
171 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
178 if (ISITHOOKED(WH_CBT
))
180 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
181 if (lResult
) return 0;
184 switch (wParam
& 0xfff0)
190 Pt
.x
= (short)LOWORD(lParam
);
191 Pt
.y
= (short)HIWORD(lParam
);
192 DefWndTrackScrollBar(hWnd
, wParam
, Pt
);
197 WinExec( "taskman.exe", SW_SHOWNORMAL
);
203 DoAppSwitch( wParam
, lParam
);
207 FIXME("Unimplemented DefWndHandleSysCommand wParam 0x%x\n",wParam
);
214 /***********************************************************************
217 * Default colors for control painting.
220 DefWndControlColor(HDC hDC
, UINT ctlType
)
222 if (ctlType
== CTLCOLOR_SCROLLBAR
)
224 HBRUSH hb
= GetSysColorBrush(COLOR_SCROLLBAR
);
225 COLORREF bk
= GetSysColor(COLOR_3DHILIGHT
);
226 SetTextColor(hDC
, GetSysColor(COLOR_3DFACE
));
229 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
230 * we better use 0x55aa bitmap brush to make scrollbar's background
231 * look different from the window background.
233 if ( bk
== GetSysColor(COLOR_WINDOW
))
234 return gpsi
->hbrGray
;
236 UnrealizeObject( hb
);
240 SetTextColor(hDC
, GetSysColor(COLOR_WINDOWTEXT
));
242 if ((ctlType
== CTLCOLOR_EDIT
) || (ctlType
== CTLCOLOR_LISTBOX
))
244 SetBkColor(hDC
, GetSysColor(COLOR_WINDOW
));
248 SetBkColor(hDC
, GetSysColor(COLOR_3DFACE
));
249 return GetSysColorBrush(COLOR_3DFACE
);
252 return GetSysColorBrush(COLOR_WINDOW
);
256 UserSendUiUpdateMsg(HWND hwnd
, LPARAM lParam
)
258 SendMessageW(hwnd
, WM_UPDATEUISTATE
, (WPARAM
)lParam
, 0);
262 /* WARNING: Redundant with /ntuser/defwnd.c!UserPaintCaption !!
263 Use TWOPARAM_ROUTINE_REDRAWTITLE/REDRAWFRAME or HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK .
266 UserPaintCaption(PWND pwnd
, INT Flags
)
268 if ( pwnd
->style
& WS_VISIBLE
&& (pwnd
->style
& WS_CAPTION
) == WS_CAPTION
)
270 if (pwnd
->state
& WNDS_HASCAPTION
&& NtUserQueryWindow(UserHMGetHandle(pwnd
), QUERY_WINDOW_FOREGROUND
))
273 * When themes are not enabled we can go on and paint the non client area.
274 * However if we do that with themes enabled we will draw a classic frame.
275 * This is solved by sending a themes specific message to notify the themes
276 * engine that the caption needs to be redrawn
278 if(gpsi
->dwSRVIFlags
& SRVINFO_APIHOOK
)
281 * This will cause uxtheme to either paint the themed caption or call
282 * RealUserDrawCaption in order to draw the classic caption when themes
283 * are disabled but the themes service is enabled
285 SendMessageW(UserHMGetHandle(pwnd
), WM_NCUAHDRAWCAPTION
, Flags
, 0);
290 HDC hDC
= GetDCEx(UserHMGetHandle(pwnd
), NULL
, DCX_WINDOW
|DCX_USESTYLE
);
291 NtUserDrawCaption(UserHMGetHandle(pwnd
), hDC
, &rc
, DC_DRAWCAPTIONMD
|Flags
);
292 ReleaseDC(UserHMGetHandle(pwnd
), hDC
);
295 //NtUserCallTwoParam((DWORD_PTR)UserHMGetHandle(pwnd),Flags,TWOPARAM_ROUTINE_REDRAWTITLE)
299 DefWndGetIcon(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
302 if ( wParam
> ICON_SMALL2
)
304 SetLastError(ERROR_INVALID_PARAMETER
);
310 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconProp
, TRUE
);
314 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconSmProp
, TRUE
);
319 return (LRESULT
)hIconRet
;
324 User32DefWindowProc(HWND hWnd
,
333 pWnd
= ValidateHwnd(hWnd
);
339 case WM_POPUPSYSTEMMENU
:
341 /* This is an undocumented message used by the windows taskbar to
342 display the system menu of windows that belong to other processes. */
343 HMENU menu
= GetSystemMenu(hWnd
, FALSE
);
344 ERR("WM_POPUPSYSTEMMENU\n");
346 TrackPopupMenu(menu
, TPM_LEFTBUTTON
|TPM_RIGHTBUTTON
|TPM_SYSTEM_MENU
,
347 LOWORD(lParam
), HIWORD(lParam
), 0, hWnd
, NULL
);
354 Pt
.x
= GET_X_LPARAM(lParam
);
355 Pt
.y
= GET_Y_LPARAM(lParam
);
356 ClientToScreen(hWnd
, &Pt
);
357 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
360 SendMessageW(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
364 SendMessageA(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
371 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
372 * in Windows), but what _should_ we do? According to MSDN :
373 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
374 * message to the window". When is it appropriate?
376 ERR("WM_NCRBUTTONUP\n");
381 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
385 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
389 SendMessageA(GetParent(hWnd
), WM_CONTEXTMENU
, wParam
, lParam
);
403 case WM_MOUSEACTIVATE
:
404 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
406 LONG Ret
= SendMessageW(GetParent(hWnd
), WM_MOUSEACTIVATE
, wParam
, lParam
);
407 if (Ret
) return (Ret
);
409 return ( (HIWORD(lParam
) == WM_LBUTTONDOWN
&& LOWORD(lParam
) == HTCAPTION
) ? MA_NOACTIVATE
: MA_ACTIVATE
);
412 /* The default action in Windows is to set the keyboard focus to
413 * the window, if it's being activated and not minimized */
414 if (LOWORD(wParam
) != WA_INACTIVE
&&
415 !(GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
))
417 //ERR("WM_ACTIVATE %p\n",hWnd);
423 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
424 return SendMessageW( GetParent(hWnd
), WM_MOUSEWHEEL
, wParam
, lParam
);
428 case WM_ICONERASEBKGND
:
431 HBRUSH hBrush
= (HBRUSH
)GetClassLongPtrW(hWnd
, GCL_HBRBACKGROUND
);
437 if (GetClassLongPtrW(hWnd
, GCL_STYLE
) & CS_PARENTDC
)
439 /* can't use GetClipBox with a parent DC or we fill the whole parent */
440 GetClientRect(hWnd
, &Rect
);
441 DPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
445 GetClipBox((HDC
)wParam
, &Rect
);
447 FillRect((HDC
)wParam
, &Rect
, hBrush
);
451 case WM_CTLCOLORMSGBOX
:
452 case WM_CTLCOLOREDIT
:
453 case WM_CTLCOLORLISTBOX
:
456 case WM_CTLCOLORSTATIC
:
457 case WM_CTLCOLORSCROLLBAR
:
458 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
461 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
464 return (DefWndHandleSysCommand(hWnd
, wParam
, lParam
));
473 case WM_QUERYDROPOBJECT
:
475 if (GetWindowLongPtrW(hWnd
, GWL_EXSTYLE
) & WS_EX_ACCEPTFILES
)
482 case WM_QUERYDRAGICON
:
487 hIcon
= (HICON
)GetClassLongPtrW(hWnd
, GCL_HICON
);
490 return ((LRESULT
)hIcon
);
492 for (Len
= 1; Len
< 64; Len
++)
494 if ((hIcon
= LoadIconW(NULL
, MAKEINTRESOURCEW(Len
))) != NULL
)
496 return((LRESULT
)hIcon
);
499 return ((LRESULT
)LoadIconW(0, IDI_APPLICATION
));
502 case WM_ISACTIVEICON
:
505 isai
= (pWnd
->state
& WNDS_ACTIVEFRAME
) != 0;
509 case WM_NOTIFYFORMAT
:
511 if (lParam
== NF_QUERY
)
512 return IsWindowUnicode(hWnd
) ? NFR_UNICODE
: NFR_ANSI
;
518 return DefWndGetIcon(pWnd
, wParam
, lParam
);
525 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
529 SendMessageA(GetParent(hWnd
), Msg
, wParam
, lParam
);
535 case WM_QUERYENDSESSION
:
540 case WM_INPUTLANGCHANGEREQUEST
:
544 if(wParam
& INPUTLANGCHANGE_BACKWARD
545 && wParam
& INPUTLANGCHANGE_FORWARD
)
550 //FIXME: What to do with INPUTLANGCHANGE_SYSCHARSET ?
552 if(wParam
& INPUTLANGCHANGE_BACKWARD
) NewHkl
= (HKL
) HKL_PREV
;
553 else if(wParam
& INPUTLANGCHANGE_FORWARD
) NewHkl
= (HKL
) HKL_NEXT
;
554 else NewHkl
= (HKL
) lParam
;
556 NtUserActivateKeyboardLayout(NewHkl
, 0);
561 case WM_INPUTLANGCHANGE
:
564 HWND
*win_array
= WIN_ListChildren( hWnd
);
568 while (win_array
[count
])
569 SendMessageW( win_array
[count
++], WM_INPUTLANGCHANGE
, wParam
, lParam
);
570 HeapFree(GetProcessHeap(),0,win_array
);
574 case WM_QUERYUISTATE
:
577 PWND Wnd
= ValidateHwnd(hWnd
);
581 Ret
|= UISF_HIDEFOCUS
;
583 Ret
|= UISF_HIDEACCEL
;
588 case WM_CHANGEUISTATE
:
590 BOOL AlwaysShowCues
= FALSE
;
591 WORD Action
= LOWORD(wParam
);
592 WORD Flags
= HIWORD(wParam
);
595 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
599 Wnd
= ValidateHwnd(hWnd
);
600 if (!Wnd
|| lParam
!= 0)
603 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
606 if (Flags
& UISF_ACTIVE
)
608 WARN("WM_CHANGEUISTATE does not yet support UISF_ACTIVE!\n");
611 if (Action
== UIS_INITIALIZE
)
613 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
617 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
618 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
620 /* We need to update wParam in case we need to send out messages */
621 wParam
= MAKEWPARAM(Action
, Flags
);
627 /* See if we actually need to change something */
628 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
630 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
633 /* Don't need to do anything... */
637 /* See if we actually need to change something */
638 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
640 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
643 /* Don't need to do anything... */
647 WARN("WM_CHANGEUISTATE: Unsupported Action 0x%x\n", Action
);
651 if ((Wnd
->style
& WS_CHILD
) && Wnd
->spwndParent
!= NULL
)
653 /* We're a child window and we need to pass this message down until
655 hWnd
= UserHMGetHandle((PWND
)DesktopPtrToUser(Wnd
->spwndParent
));
659 /* We're a top level window, we need to change the UI state */
660 Msg
= WM_UPDATEUISTATE
;
664 return SendMessageW(hWnd
, Msg
, wParam
, lParam
);
666 return SendMessageA(hWnd
, Msg
, wParam
, lParam
);
669 case WM_UPDATEUISTATE
:
672 BOOL AlwaysShowCues
= FALSE
;
673 WORD Action
= LOWORD(wParam
);
674 WORD Flags
= HIWORD(wParam
);
677 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
681 Wnd
= ValidateHwnd(hWnd
);
682 if (!Wnd
|| lParam
!= 0)
685 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
688 if (Flags
& UISF_ACTIVE
)
690 WARN("WM_UPDATEUISTATE does not yet support UISF_ACTIVE!\n");
693 if (Action
== UIS_INITIALIZE
)
695 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
699 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
700 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
702 /* We need to update wParam for broadcasting the update */
703 wParam
= MAKEWPARAM(Action
, Flags
);
709 /* See if we actually need to change something */
710 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
712 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
715 /* Don't need to do anything... */
720 /* See if we actually need to change something */
721 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
723 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
726 /* Don't need to do anything... */
731 WARN("WM_UPDATEUISTATE: Unsupported Action 0x%x\n", Action
);
735 /* Pack the information and call win32k */
738 if (!NtUserxUpdateUiState(hWnd
, Flags
| ((DWORD
)Action
<< 3)))
742 /* Always broadcast the update to all children */
743 EnumChildWindows(hWnd
,
750 /* Move to Win32k !*/
752 if (!lParam
) break; // Call when it is necessary.
756 case WM_NCLBUTTONDOWN
:
757 case WM_NCRBUTTONDOWN
:
758 case WM_LBUTTONDBLCLK
:
759 case WM_NCLBUTTONDBLCLK
:
771 case WM_SYSCOLORCHANGE
:
772 case WM_NCUAHDRAWCAPTION
:
773 case WM_NCUAHDRAWFRAME
:
780 case WM_CLIENTSHUTDOWN
:
783 case WM_WINDOWPOSCHANGING
:
784 case WM_WINDOWPOSCHANGED
:
790 NtUserMessageCall( hWnd
, Msg
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, !bUnicode
);
799 * helpers for calling IMM32 (from Wine 10/22/2008)
801 * WM_IME_* messages are generated only by IMM32,
802 * so I assume imm32 is already LoadLibrary-ed.
805 DefWndImmGetDefaultIMEWnd(HWND hwnd
)
807 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
808 HWND (WINAPI
*pFunc
)(HWND
);
813 ERR("cannot get IMM32 handle\n");
817 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmGetDefaultIMEWnd");
819 hwndRet
= (*pFunc
)(hwnd
);
826 DefWndImmIsUIMessageA(HWND hwndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
828 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
829 BOOL (WINAPI
*pFunc
)(HWND
,UINT
,WPARAM
,LPARAM
);
834 ERR("cannot get IMM32 handle\n");
838 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmIsUIMessageA");
840 fRet
= (*pFunc
)(hwndIME
, msg
, wParam
, lParam
);
847 DefWndImmIsUIMessageW(HWND hwndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
849 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
850 BOOL (WINAPI
*pFunc
)(HWND
,UINT
,WPARAM
,LPARAM
);
855 ERR("cannot get IMM32 handle\n");
859 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmIsUIMessageW");
861 fRet
= (*pFunc
)(hwndIME
, msg
, wParam
, lParam
);
868 RealDefWindowProcA(HWND hWnd
,
876 Wnd
= ValidateHwnd(hWnd
);
879 Msg
!= WM_CTLCOLORMSGBOX
&&
880 Msg
!= WM_CTLCOLORBTN
&&
881 Msg
!= WM_CTLCOLORDLG
&&
882 Msg
!= WM_CTLCOLORSTATIC
)
885 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
891 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
895 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
896 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
897 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
903 LPCREATESTRUCTA cs
= (LPCREATESTRUCTA
)lParam
;
904 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
905 * may have child window IDs instead of window name */
906 if (HIWORD(cs
->lpszName
))
908 DefSetText(hWnd
, (PCWSTR
)cs
->lpszName
, TRUE
);
915 case WM_GETTEXTLENGTH
:
920 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
922 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
924 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
926 Wnd
->strName
.Length
)))
928 Result
= (LRESULT
) len
;
939 PSTR outbuf
= (PSTR
)lParam
;
942 if (Wnd
!= NULL
&& wParam
!= 0)
944 if (Wnd
->strName
.Buffer
!= NULL
)
945 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
951 if (Wnd
->strName
.Length
!= 0)
953 copy
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
954 Result
= WideCharToMultiByte(CP_ACP
,
962 outbuf
[Result
] = '\0';
973 DefSetText(hWnd
, (PCWSTR
)lParam
, TRUE
);
975 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
977 UserPaintCaption(Wnd
, DC_TEXT
);
978 IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE
, hWnd
, OBJID_WINDOW
, CHILDID_SELF
, 0);
986 Result
= PostMessageA(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
992 Result
= PostMessageA(hWnd
, WM_KEYUP
, wParam
, lParam
);
999 PostMessageA(hWnd
, WM_CHAR
, HIBYTE(wParam
), lParam
);
1000 PostMessageA(hWnd
, WM_CHAR
, LOBYTE(wParam
), lParam
);
1004 case WM_IME_STARTCOMPOSITION
:
1005 case WM_IME_COMPOSITION
:
1006 case WM_IME_ENDCOMPOSITION
:
1009 case WM_IME_CONTROL
:
1013 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1015 Result
= SendMessageA(hwndIME
, Msg
, wParam
, lParam
);
1019 case WM_IME_SETCONTEXT
:
1023 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1025 Result
= DefWndImmIsUIMessageA(hwndIME
, Msg
, wParam
, lParam
);
1031 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, FALSE
);
1034 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1040 RealDefWindowProcW(HWND hWnd
,
1048 Wnd
= ValidateHwnd(hWnd
);
1051 Msg
!= WM_CTLCOLORMSGBOX
&&
1052 Msg
!= WM_CTLCOLORBTN
&&
1053 Msg
!= WM_CTLCOLORDLG
&&
1054 Msg
!= WM_CTLCOLORSTATIC
)
1057 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1063 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
1067 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
1068 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
1069 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
1075 LPCREATESTRUCTW cs
= (LPCREATESTRUCTW
)lParam
;
1076 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1077 * may have child window IDs instead of window name */
1078 if (HIWORD(cs
->lpszName
))
1080 DefSetText(hWnd
, cs
->lpszName
, FALSE
);
1087 case WM_GETTEXTLENGTH
:
1092 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
1094 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1096 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1098 Wnd
->strName
.Length
)))
1100 Result
= (LRESULT
) (Wnd
->strName
.Length
/ sizeof(WCHAR
));
1111 PWSTR outbuf
= (PWSTR
)lParam
;
1113 if (Wnd
!= NULL
&& wParam
!= 0)
1115 if (Wnd
->strName
.Buffer
!= NULL
)
1116 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1122 if (Wnd
->strName
.Length
!= 0)
1124 Result
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1125 RtlCopyMemory(outbuf
,
1127 Result
* sizeof(WCHAR
));
1128 outbuf
[Result
] = L
'\0';
1139 DefSetText(hWnd
, (PCWSTR
)lParam
, FALSE
);
1141 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1142 UserPaintCaption(Wnd
, DC_TEXT
);
1149 PostMessageW(hWnd
, WM_CHAR
, wParam
, lParam
);
1154 case WM_IME_KEYDOWN
:
1156 Result
= PostMessageW(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
1162 Result
= PostMessageW(hWnd
, WM_KEYUP
, wParam
, lParam
);
1166 case WM_IME_STARTCOMPOSITION
:
1167 case WM_IME_COMPOSITION
:
1168 case WM_IME_ENDCOMPOSITION
:
1171 case WM_IME_CONTROL
:
1175 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1177 Result
= SendMessageW(hwndIME
, Msg
, wParam
, lParam
);
1181 case WM_IME_SETCONTEXT
:
1185 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1187 Result
= DefWndImmIsUIMessageW(hwndIME
, Msg
, wParam
, lParam
);
1192 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, TRUE
);
1194 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1200 DefWindowProcA(HWND hWnd
,
1205 BOOL Hook
, msgOverride
= FALSE
;
1210 Hook
= BeginIfHookedUserApiHook();
1213 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1214 if(msgOverride
== FALSE
)
1220 /* Bypass SEH and go direct. */
1221 if (!Hook
|| !msgOverride
)
1222 return RealDefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1226 Result
= guah
.DefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1228 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1239 DefWindowProcW(HWND hWnd
,
1244 BOOL Hook
, msgOverride
= FALSE
;
1249 Hook
= BeginIfHookedUserApiHook();
1252 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1253 if(msgOverride
== FALSE
)
1259 /* Bypass SEH and go direct. */
1260 if (!Hook
|| !msgOverride
)
1261 return RealDefWindowProcW(hWnd
, Msg
, wParam
, lParam
);
1265 Result
= guah
.DefWindowProcW(hWnd
, Msg
, wParam
, lParam
);
1267 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)