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)
166 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
173 if (ISITHOOKED(WH_CBT
))
175 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
176 if (lResult
) return 0;
179 switch (wParam
& 0xfff0)
183 if (hWnd
== GetActiveWindow())
184 ShowOwnedPopups(hWnd
,FALSE
);
185 ShowWindow( hWnd
, SW_MINIMIZE
);
189 if (IsIconic(hWnd
) && hWnd
== GetActiveWindow())
190 ShowOwnedPopups(hWnd
,TRUE
);
191 ShowWindow( hWnd
, SW_MAXIMIZE
);
195 if (IsIconic(hWnd
) && hWnd
== GetActiveWindow())
196 ShowOwnedPopups(hWnd
,TRUE
);
197 ShowWindow( hWnd
, SW_RESTORE
);
201 return SendMessageW(hWnd
, WM_CLOSE
, 0, 0);
206 Pt
.x
= (short)LOWORD(lParam
);
207 Pt
.y
= (short)HIWORD(lParam
);
208 DefWndTrackScrollBar(hWnd
, wParam
, Pt
);
213 WinExec( "taskman.exe", SW_SHOWNORMAL
);
219 DoAppSwitch( wParam
, lParam
);
224 HWND hwnd
, hWndLastActive
;
228 pWnd
= ValidateHwnd(hwnd
);
231 hWndLastActive
= GetLastActivePopup(hwnd
);
234 hwnd
= hWndLastActive
;
235 pWnd
= ValidateHwnd(hwnd
);
237 SetForegroundWindow(hwnd
);
238 if (pWnd
->style
& WS_MINIMIZE
)
240 PostMessage(hwnd
, WM_SYSCOMMAND
, SC_RESTORE
, 0);
247 FIXME("Unimplemented DefWndHandleSysCommand wParam 0x%x\n",wParam
);
254 /***********************************************************************
257 * Default colors for control painting.
260 DefWndControlColor(HDC hDC
, UINT ctlType
)
262 if (ctlType
== CTLCOLOR_SCROLLBAR
)
264 HBRUSH hb
= GetSysColorBrush(COLOR_SCROLLBAR
);
265 COLORREF bk
= GetSysColor(COLOR_3DHILIGHT
);
266 SetTextColor(hDC
, GetSysColor(COLOR_3DFACE
));
269 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
270 * we better use 0x55aa bitmap brush to make scrollbar's background
271 * look different from the window background.
273 if ( bk
== GetSysColor(COLOR_WINDOW
))
274 return gpsi
->hbrGray
;
276 UnrealizeObject( hb
);
280 SetTextColor(hDC
, GetSysColor(COLOR_WINDOWTEXT
));
282 if ((ctlType
== CTLCOLOR_EDIT
) || (ctlType
== CTLCOLOR_LISTBOX
))
284 SetBkColor(hDC
, GetSysColor(COLOR_WINDOW
));
288 SetBkColor(hDC
, GetSysColor(COLOR_3DFACE
));
289 return GetSysColorBrush(COLOR_3DFACE
);
292 return GetSysColorBrush(COLOR_WINDOW
);
296 UserSendUiUpdateMsg(HWND hwnd
, LPARAM lParam
)
298 SendMessageW(hwnd
, WM_UPDATEUISTATE
, (WPARAM
)lParam
, 0);
302 /* WARNING: Redundant with /ntuser/defwnd.c!UserPaintCaption !!
303 Use TWOPARAM_ROUTINE_REDRAWTITLE/REDRAWFRAME or HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK .
306 UserPaintCaption(PWND pwnd
, INT Flags
)
308 if ( pwnd
->style
& WS_VISIBLE
&& (pwnd
->style
& WS_CAPTION
) == WS_CAPTION
)
310 if (pwnd
->state
& WNDS_HASCAPTION
&& NtUserQueryWindow(UserHMGetHandle(pwnd
), QUERY_WINDOW_FOREGROUND
))
313 * When themes are not enabled we can go on and paint the non client area.
314 * However if we do that with themes enabled we will draw a classic frame.
315 * This is solved by sending a themes specific message to notify the themes
316 * engine that the caption needs to be redrawn
318 if(gpsi
->dwSRVIFlags
& SRVINFO_APIHOOK
)
321 * This will cause uxtheme to either paint the themed caption or call
322 * RealUserDrawCaption in order to draw the classic caption when themes
323 * are disabled but the themes service is enabled
325 SendMessageW(UserHMGetHandle(pwnd
), WM_NCUAHDRAWCAPTION
, Flags
, 0);
330 HDC hDC
= GetDCEx(UserHMGetHandle(pwnd
), NULL
, DCX_WINDOW
|DCX_USESTYLE
);
331 NtUserDrawCaption(UserHMGetHandle(pwnd
), hDC
, &rc
, DC_DRAWCAPTIONMD
|Flags
);
332 ReleaseDC(UserHMGetHandle(pwnd
), hDC
);
335 //NtUserCallTwoParam((DWORD_PTR)UserHMGetHandle(pwnd),Flags,TWOPARAM_ROUTINE_REDRAWTITLE)
339 DefWndGetIcon(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
342 if ( wParam
> ICON_SMALL2
)
344 SetLastError(ERROR_INVALID_PARAMETER
);
350 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconProp
, TRUE
);
354 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconSmProp
, TRUE
);
359 return (LRESULT
)hIconRet
;
364 User32DefWindowProc(HWND hWnd
,
373 pWnd
= ValidateHwnd(hWnd
);
379 case WM_POPUPSYSTEMMENU
:
381 /* This is an undocumented message used by the windows taskbar to
382 display the system menu of windows that belong to other processes. */
383 HMENU menu
= GetSystemMenu(hWnd
, FALSE
);
384 ERR("WM_POPUPSYSTEMMENU\n");
386 TrackPopupMenu(menu
, TPM_LEFTBUTTON
|TPM_RIGHTBUTTON
|TPM_SYSTEM_MENU
,
387 LOWORD(lParam
), HIWORD(lParam
), 0, hWnd
, NULL
);
394 Pt
.x
= GET_X_LPARAM(lParam
);
395 Pt
.y
= GET_Y_LPARAM(lParam
);
396 ClientToScreen(hWnd
, &Pt
);
397 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
400 SendMessageW(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
404 SendMessageA(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
411 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
412 * in Windows), but what _should_ we do? According to MSDN :
413 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
414 * message to the window". When is it appropriate?
416 ERR("WM_NCRBUTTONUP\n");
421 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
425 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
429 SendMessageA(GetParent(hWnd
), WM_CONTEXTMENU
, wParam
, lParam
);
443 case WM_MOUSEACTIVATE
:
444 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
446 LONG Ret
= SendMessageW(GetParent(hWnd
), WM_MOUSEACTIVATE
, wParam
, lParam
);
447 if (Ret
) return (Ret
);
449 return ( (HIWORD(lParam
) == WM_LBUTTONDOWN
&& LOWORD(lParam
) == HTCAPTION
) ? MA_NOACTIVATE
: MA_ACTIVATE
);
452 /* The default action in Windows is to set the keyboard focus to
453 * the window, if it's being activated and not minimized */
454 if (LOWORD(wParam
) != WA_INACTIVE
&&
455 !(GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
))
457 //ERR("WM_ACTIVATE %p\n",hWnd);
463 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
464 return SendMessageW( GetParent(hWnd
), WM_MOUSEWHEEL
, wParam
, lParam
);
468 case WM_ICONERASEBKGND
:
471 HBRUSH hBrush
= (HBRUSH
)GetClassLongPtrW(hWnd
, GCL_HBRBACKGROUND
);
477 if (GetClassLongPtrW(hWnd
, GCL_STYLE
) & CS_PARENTDC
)
479 /* can't use GetClipBox with a parent DC or we fill the whole parent */
480 GetClientRect(hWnd
, &Rect
);
481 DPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
485 GetClipBox((HDC
)wParam
, &Rect
);
487 FillRect((HDC
)wParam
, &Rect
, hBrush
);
491 case WM_CTLCOLORMSGBOX
:
492 case WM_CTLCOLOREDIT
:
493 case WM_CTLCOLORLISTBOX
:
496 case WM_CTLCOLORSTATIC
:
497 case WM_CTLCOLORSCROLLBAR
:
498 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
501 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
504 return (DefWndHandleSysCommand(hWnd
, wParam
, lParam
));
513 case WM_QUERYDROPOBJECT
:
515 if (GetWindowLongPtrW(hWnd
, GWL_EXSTYLE
) & WS_EX_ACCEPTFILES
)
522 case WM_QUERYDRAGICON
:
527 hIcon
= (HICON
)GetClassLongPtrW(hWnd
, GCL_HICON
);
530 return ((LRESULT
)hIcon
);
532 for (Len
= 1; Len
< 64; Len
++)
534 if ((hIcon
= LoadIconW(NULL
, MAKEINTRESOURCEW(Len
))) != NULL
)
536 return((LRESULT
)hIcon
);
539 return ((LRESULT
)LoadIconW(0, IDI_APPLICATION
));
542 case WM_ISACTIVEICON
:
545 isai
= (pWnd
->state
& WNDS_ACTIVEFRAME
) != 0;
549 case WM_NOTIFYFORMAT
:
551 if (lParam
== NF_QUERY
)
552 return IsWindowUnicode(hWnd
) ? NFR_UNICODE
: NFR_ANSI
;
558 return DefWndGetIcon(pWnd
, wParam
, lParam
);
565 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
569 SendMessageA(GetParent(hWnd
), Msg
, wParam
, lParam
);
575 case WM_QUERYENDSESSION
:
580 case WM_INPUTLANGCHANGEREQUEST
:
584 if(wParam
& INPUTLANGCHANGE_BACKWARD
585 && wParam
& INPUTLANGCHANGE_FORWARD
)
590 //FIXME: What to do with INPUTLANGCHANGE_SYSCHARSET ?
592 if(wParam
& INPUTLANGCHANGE_BACKWARD
) NewHkl
= (HKL
) HKL_PREV
;
593 else if(wParam
& INPUTLANGCHANGE_FORWARD
) NewHkl
= (HKL
) HKL_NEXT
;
594 else NewHkl
= (HKL
) lParam
;
596 NtUserActivateKeyboardLayout(NewHkl
, 0);
601 case WM_INPUTLANGCHANGE
:
604 HWND
*win_array
= WIN_ListChildren( hWnd
);
608 while (win_array
[count
])
609 SendMessageW( win_array
[count
++], WM_INPUTLANGCHANGE
, wParam
, lParam
);
610 HeapFree(GetProcessHeap(),0,win_array
);
614 case WM_QUERYUISTATE
:
617 PWND Wnd
= ValidateHwnd(hWnd
);
621 Ret
|= UISF_HIDEFOCUS
;
623 Ret
|= UISF_HIDEACCEL
;
628 case WM_CHANGEUISTATE
:
630 BOOL AlwaysShowCues
= FALSE
;
631 WORD Action
= LOWORD(wParam
);
632 WORD Flags
= HIWORD(wParam
);
635 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
639 Wnd
= ValidateHwnd(hWnd
);
640 if (!Wnd
|| lParam
!= 0)
643 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
646 if (Flags
& UISF_ACTIVE
)
648 WARN("WM_CHANGEUISTATE does not yet support UISF_ACTIVE!\n");
651 if (Action
== UIS_INITIALIZE
)
653 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
657 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
658 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
660 /* We need to update wParam in case we need to send out messages */
661 wParam
= MAKEWPARAM(Action
, Flags
);
667 /* See if we actually need to change something */
668 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
670 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
673 /* Don't need to do anything... */
677 /* See if we actually need to change something */
678 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
680 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
683 /* Don't need to do anything... */
687 WARN("WM_CHANGEUISTATE: Unsupported Action 0x%x\n", Action
);
691 if ((Wnd
->style
& WS_CHILD
) && Wnd
->spwndParent
!= NULL
)
693 /* We're a child window and we need to pass this message down until
695 hWnd
= UserHMGetHandle((PWND
)DesktopPtrToUser(Wnd
->spwndParent
));
699 /* We're a top level window, we need to change the UI state */
700 Msg
= WM_UPDATEUISTATE
;
704 return SendMessageW(hWnd
, Msg
, wParam
, lParam
);
706 return SendMessageA(hWnd
, Msg
, wParam
, lParam
);
709 case WM_UPDATEUISTATE
:
712 BOOL AlwaysShowCues
= FALSE
;
713 WORD Action
= LOWORD(wParam
);
714 WORD Flags
= HIWORD(wParam
);
717 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
721 Wnd
= ValidateHwnd(hWnd
);
722 if (!Wnd
|| lParam
!= 0)
725 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
728 if (Flags
& UISF_ACTIVE
)
730 WARN("WM_UPDATEUISTATE does not yet support UISF_ACTIVE!\n");
733 if (Action
== UIS_INITIALIZE
)
735 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
739 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
740 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
742 /* We need to update wParam for broadcasting the update */
743 wParam
= MAKEWPARAM(Action
, Flags
);
749 /* See if we actually need to change something */
750 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
752 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
755 /* Don't need to do anything... */
760 /* See if we actually need to change something */
761 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
763 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
766 /* Don't need to do anything... */
771 WARN("WM_UPDATEUISTATE: Unsupported Action 0x%x\n", Action
);
775 /* Pack the information and call win32k */
778 if (!NtUserxUpdateUiState(hWnd
, Flags
| ((DWORD
)Action
<< 3)))
782 /* Always broadcast the update to all children */
783 EnumChildWindows(hWnd
,
790 /* Move to Win32k !*/
792 if (!lParam
) break; // Call when it is necessary.
796 case WM_NCLBUTTONDOWN
:
797 case WM_NCRBUTTONDOWN
:
798 case WM_LBUTTONDBLCLK
:
799 case WM_NCLBUTTONDBLCLK
:
811 case WM_SYSCOLORCHANGE
:
812 case WM_NCUAHDRAWCAPTION
:
813 case WM_NCUAHDRAWFRAME
:
820 case WM_CLIENTSHUTDOWN
:
823 case WM_WINDOWPOSCHANGING
:
824 case WM_WINDOWPOSCHANGED
:
830 NtUserMessageCall( hWnd
, Msg
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, !bUnicode
);
839 * helpers for calling IMM32 (from Wine 10/22/2008)
841 * WM_IME_* messages are generated only by IMM32,
842 * so I assume imm32 is already LoadLibrary-ed.
845 DefWndImmGetDefaultIMEWnd(HWND hwnd
)
847 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
848 HWND (WINAPI
*pFunc
)(HWND
);
853 ERR("cannot get IMM32 handle\n");
857 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmGetDefaultIMEWnd");
859 hwndRet
= (*pFunc
)(hwnd
);
866 DefWndImmIsUIMessageA(HWND hwndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
868 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
869 BOOL (WINAPI
*pFunc
)(HWND
,UINT
,WPARAM
,LPARAM
);
874 ERR("cannot get IMM32 handle\n");
878 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmIsUIMessageA");
880 fRet
= (*pFunc
)(hwndIME
, msg
, wParam
, lParam
);
887 DefWndImmIsUIMessageW(HWND hwndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
889 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
890 BOOL (WINAPI
*pFunc
)(HWND
,UINT
,WPARAM
,LPARAM
);
895 ERR("cannot get IMM32 handle\n");
899 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmIsUIMessageW");
901 fRet
= (*pFunc
)(hwndIME
, msg
, wParam
, lParam
);
908 RealDefWindowProcA(HWND hWnd
,
916 Wnd
= ValidateHwnd(hWnd
);
919 Msg
!= WM_CTLCOLORMSGBOX
&&
920 Msg
!= WM_CTLCOLORBTN
&&
921 Msg
!= WM_CTLCOLORDLG
&&
922 Msg
!= WM_CTLCOLORSTATIC
)
925 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
931 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
935 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
936 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
937 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
943 LPCREATESTRUCTA cs
= (LPCREATESTRUCTA
)lParam
;
944 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
945 * may have child window IDs instead of window name */
946 if (HIWORD(cs
->lpszName
))
948 DefSetText(hWnd
, (PCWSTR
)cs
->lpszName
, TRUE
);
955 case WM_GETTEXTLENGTH
:
960 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
962 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
964 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
966 Wnd
->strName
.Length
)))
968 Result
= (LRESULT
) len
;
979 PSTR outbuf
= (PSTR
)lParam
;
982 if (Wnd
!= NULL
&& wParam
!= 0)
984 if (Wnd
->strName
.Buffer
!= NULL
)
985 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
991 if (Wnd
->strName
.Length
!= 0)
993 copy
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
994 Result
= WideCharToMultiByte(CP_ACP
,
1002 outbuf
[Result
] = '\0';
1013 DefSetText(hWnd
, (PCWSTR
)lParam
, TRUE
);
1015 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1017 UserPaintCaption(Wnd
, DC_TEXT
);
1018 IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE
, hWnd
, OBJID_WINDOW
, CHILDID_SELF
, 0);
1024 case WM_IME_KEYDOWN
:
1026 Result
= PostMessageA(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
1032 Result
= PostMessageA(hWnd
, WM_KEYUP
, wParam
, lParam
);
1039 PostMessageA(hWnd
, WM_CHAR
, HIBYTE(wParam
), lParam
);
1040 PostMessageA(hWnd
, WM_CHAR
, LOBYTE(wParam
), lParam
);
1044 case WM_IME_STARTCOMPOSITION
:
1045 case WM_IME_COMPOSITION
:
1046 case WM_IME_ENDCOMPOSITION
:
1049 case WM_IME_CONTROL
:
1053 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1055 Result
= SendMessageA(hwndIME
, Msg
, wParam
, lParam
);
1059 case WM_IME_SETCONTEXT
:
1063 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1065 Result
= DefWndImmIsUIMessageA(hwndIME
, Msg
, wParam
, lParam
);
1071 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, FALSE
);
1074 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1080 RealDefWindowProcW(HWND hWnd
,
1088 Wnd
= ValidateHwnd(hWnd
);
1091 Msg
!= WM_CTLCOLORMSGBOX
&&
1092 Msg
!= WM_CTLCOLORBTN
&&
1093 Msg
!= WM_CTLCOLORDLG
&&
1094 Msg
!= WM_CTLCOLORSTATIC
)
1097 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1103 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
1107 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
1108 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
1109 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
1115 LPCREATESTRUCTW cs
= (LPCREATESTRUCTW
)lParam
;
1116 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1117 * may have child window IDs instead of window name */
1118 if (HIWORD(cs
->lpszName
))
1120 DefSetText(hWnd
, cs
->lpszName
, FALSE
);
1127 case WM_GETTEXTLENGTH
:
1132 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
1134 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1136 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1138 Wnd
->strName
.Length
)))
1140 Result
= (LRESULT
) (Wnd
->strName
.Length
/ sizeof(WCHAR
));
1151 PWSTR outbuf
= (PWSTR
)lParam
;
1153 if (Wnd
!= NULL
&& wParam
!= 0)
1155 if (Wnd
->strName
.Buffer
!= NULL
)
1156 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1162 if (Wnd
->strName
.Length
!= 0)
1164 Result
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1165 RtlCopyMemory(outbuf
,
1167 Result
* sizeof(WCHAR
));
1168 outbuf
[Result
] = L
'\0';
1179 DefSetText(hWnd
, (PCWSTR
)lParam
, FALSE
);
1181 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1182 UserPaintCaption(Wnd
, DC_TEXT
);
1189 PostMessageW(hWnd
, WM_CHAR
, wParam
, lParam
);
1194 case WM_IME_KEYDOWN
:
1196 Result
= PostMessageW(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
1202 Result
= PostMessageW(hWnd
, WM_KEYUP
, wParam
, lParam
);
1206 case WM_IME_STARTCOMPOSITION
:
1207 case WM_IME_COMPOSITION
:
1208 case WM_IME_ENDCOMPOSITION
:
1211 case WM_IME_CONTROL
:
1215 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1217 Result
= SendMessageW(hwndIME
, Msg
, wParam
, lParam
);
1221 case WM_IME_SETCONTEXT
:
1225 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1227 Result
= DefWndImmIsUIMessageW(hwndIME
, Msg
, wParam
, lParam
);
1232 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, TRUE
);
1234 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1240 DefWindowProcA(HWND hWnd
,
1245 BOOL Hook
, msgOverride
= FALSE
;
1250 Hook
= BeginIfHookedUserApiHook();
1253 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1254 if(msgOverride
== FALSE
)
1260 /* Bypass SEH and go direct. */
1261 if (!Hook
|| !msgOverride
)
1262 return RealDefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1266 Result
= guah
.DefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1268 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1279 DefWindowProcW(HWND hWnd
,
1284 BOOL Hook
, msgOverride
= FALSE
;
1289 Hook
= BeginIfHookedUserApiHook();
1292 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1293 if(msgOverride
== FALSE
)
1299 /* Bypass SEH and go direct. */
1300 if (!Hook
|| !msgOverride
)
1301 return RealDefWindowProcW(hWnd
, Msg
, wParam
, lParam
);
1305 Result
= guah
.DefWindowProcW(hWnd
, Msg
, wParam
, lParam
);
1307 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)