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
14 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
22 GetSysColor(int nIndex
)
24 if(nIndex
>= 0 && nIndex
< NUM_SYSCOLORS
)
26 return gpsi
->argbSystem
[nIndex
];
29 SetLastError(ERROR_INVALID_PARAMETER
);
39 GetSysColorBrush(int nIndex
)
41 if(nIndex
>= 0 && nIndex
< NUM_SYSCOLORS
)
43 return gpsi
->ahbrSystem
[nIndex
];
56 CONST INT
*lpaElements
,
57 CONST COLORREF
*lpaRgbValues
)
59 return NtUserSetSysColors(cElements
, lpaElements
, lpaRgbValues
, 0);
64 DefSetText(HWND hWnd
, PCWSTR String
, BOOL Ansi
)
67 LARGE_STRING lsString
;
72 RtlInitLargeAnsiString((PLARGE_ANSI_STRING
)&lsString
, (PCSZ
)String
, 0);
74 RtlInitLargeUnicodeString((PLARGE_UNICODE_STRING
)&lsString
, String
, 0);
76 Ret
= NtUserDefSetText(hWnd
, (String
? &lsString
: NULL
));
82 IntFindChildWindowToOwner(HWND hRoot
, HWND hOwner
)
85 PWND Child
, OwnerWnd
, Root
, Owner
;
87 Root
= ValidateHwnd(hRoot
);
88 Owner
= ValidateHwnd(hOwner
);
90 for( Child
= Root
->spwndChild
? DesktopPtrToUser(Root
->spwndChild
) : NULL
;
92 Child
= Child
->spwndNext
? DesktopPtrToUser(Child
->spwndNext
) : NULL
)
94 OwnerWnd
= Child
->spwndOwner
? DesktopPtrToUser(Child
->spwndOwner
) : NULL
;
98 if (!(Child
->style
& WS_POPUP
) || !(Child
->style
& WS_VISIBLE
))
101 if(OwnerWnd
== Owner
)
107 ERR("IDCWTO Nothing found\n");
111 /***********************************************************************
112 * DefWndTrackScrollBar
114 * Track a mouse button press on the horizontal or vertical scroll-bar.
117 DefWndTrackScrollBar(HWND Wnd
, WPARAM wParam
, POINT Pt
)
121 if (SC_HSCROLL
== (wParam
& 0xfff0))
123 if (HTHSCROLL
!= (wParam
& 0x0f))
129 else /* SC_VSCROLL */
131 if (HTVSCROLL
!= (wParam
& 0x0f))
137 ScrollTrackScrollBar(Wnd
, ScrollBar
, Pt
);
140 LRESULT WINAPI
DoAppSwitch( WPARAM wParam
, LPARAM lParam
);
143 DefWndHandleSysCommand(HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
148 if (!IsWindowEnabled( hWnd
)) return 0;
150 switch (wParam
& 0xfff0)
163 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
170 if (ISITHOOKED(WH_CBT
))
172 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
173 if (lResult
) return 0;
176 switch (wParam
& 0xfff0)
182 Pt
.x
= (short)LOWORD(lParam
);
183 Pt
.y
= (short)HIWORD(lParam
);
184 DefWndTrackScrollBar(hWnd
, wParam
, Pt
);
189 WinExec( "taskman.exe", SW_SHOWNORMAL
);
195 DoAppSwitch( wParam
, lParam
);
199 FIXME("Unimplemented DefWndHandleSysCommand wParam 0x%x\n",wParam
);
206 /***********************************************************************
209 * Default colors for control painting.
212 DefWndControlColor(HDC hDC
, UINT ctlType
)
214 if (ctlType
== CTLCOLOR_SCROLLBAR
)
216 HBRUSH hb
= GetSysColorBrush(COLOR_SCROLLBAR
);
217 COLORREF bk
= GetSysColor(COLOR_3DHILIGHT
);
218 SetTextColor(hDC
, GetSysColor(COLOR_3DFACE
));
221 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
222 * we better use 0x55aa bitmap brush to make scrollbar's background
223 * look different from the window background.
225 if ( bk
== GetSysColor(COLOR_WINDOW
))
226 return gpsi
->hbrGray
;
228 UnrealizeObject( hb
);
232 SetTextColor(hDC
, GetSysColor(COLOR_WINDOWTEXT
));
234 if ((ctlType
== CTLCOLOR_EDIT
) || (ctlType
== CTLCOLOR_LISTBOX
))
236 SetBkColor(hDC
, GetSysColor(COLOR_WINDOW
));
240 SetBkColor(hDC
, GetSysColor(COLOR_3DFACE
));
241 return GetSysColorBrush(COLOR_3DFACE
);
244 return GetSysColorBrush(COLOR_WINDOW
);
248 UserSendUiUpdateMsg(HWND hwnd
, LPARAM lParam
)
250 SendMessageW(hwnd
, WM_UPDATEUISTATE
, (WPARAM
)lParam
, 0);
254 /* WARNING: Redundant with /ntuser/defwnd.c!UserPaintCaption !!
255 Use TWOPARAM_ROUTINE_REDRAWTITLE/REDRAWFRAME or HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK .
258 UserPaintCaption(PWND pwnd
, INT Flags
)
260 if ( pwnd
->style
& WS_VISIBLE
&& (pwnd
->style
& WS_CAPTION
) == WS_CAPTION
)
262 if (pwnd
->state
& WNDS_HASCAPTION
&& NtUserQueryWindow(UserHMGetHandle(pwnd
), QUERY_WINDOW_FOREGROUND
))
265 * When themes are not enabled we can go on and paint the non client area.
266 * However if we do that with themes enabled we will draw a classic frame.
267 * This is solved by sending a themes specific message to notify the themes
268 * engine that the caption needs to be redrawn
270 if(gpsi
->dwSRVIFlags
& SRVINFO_APIHOOK
)
273 * This will cause uxtheme to either paint the themed caption or call
274 * RealUserDrawCaption in order to draw the classic caption when themes
275 * are disabled but the themes service is enabled
277 SendMessageW(UserHMGetHandle(pwnd
), WM_NCUAHDRAWCAPTION
, Flags
, 0);
282 HDC hDC
= GetDCEx(UserHMGetHandle(pwnd
), NULL
, DCX_WINDOW
|DCX_USESTYLE
);
283 NtUserDrawCaption(UserHMGetHandle(pwnd
), hDC
, &rc
, DC_DRAWCAPTIONMD
|Flags
);
284 ReleaseDC(UserHMGetHandle(pwnd
), hDC
);
287 //NtUserCallTwoParam((DWORD_PTR)UserHMGetHandle(pwnd),Flags,TWOPARAM_ROUTINE_REDRAWTITLE)
291 DefWndGetIcon(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
294 if ( wParam
> ICON_SMALL2
)
296 SetLastError(ERROR_INVALID_PARAMETER
);
302 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconProp
, TRUE
);
306 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconSmProp
, TRUE
);
311 return (LRESULT
)hIconRet
;
316 User32DefWindowProc(HWND hWnd
,
325 pWnd
= ValidateHwnd(hWnd
);
331 case WM_POPUPSYSTEMMENU
:
333 /* This is an undocumented message used by the windows taskbar to
334 display the system menu of windows that belong to other processes. */
335 HMENU menu
= GetSystemMenu(hWnd
, FALSE
);
336 ERR("WM_POPUPSYSTEMMENU\n");
338 TrackPopupMenu(menu
, TPM_LEFTBUTTON
|TPM_RIGHTBUTTON
|TPM_SYSTEM_MENU
,
339 LOWORD(lParam
), HIWORD(lParam
), 0, hWnd
, NULL
);
346 Pt
.x
= GET_X_LPARAM(lParam
);
347 Pt
.y
= GET_Y_LPARAM(lParam
);
348 ClientToScreen(hWnd
, &Pt
);
349 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
352 SendMessageW(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
356 SendMessageA(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
363 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
364 * in Windows), but what _should_ we do? According to MSDN :
365 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
366 * message to the window". When is it appropriate?
368 ERR("WM_NCRBUTTONUP\n");
373 if (HIWORD(wParam
) == XBUTTON1
|| HIWORD(wParam
) == XBUTTON2
)
375 SendMessageW(hWnd
, WM_APPCOMMAND
, (WPARAM
)hWnd
,
376 MAKELPARAM(LOWORD(wParam
), FAPPCOMMAND_MOUSE
| HIWORD(wParam
)));
382 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
386 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
390 SendMessageA(GetParent(hWnd
), WM_CONTEXTMENU
, wParam
, lParam
);
404 case WM_MOUSEACTIVATE
:
405 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
407 LONG Ret
= SendMessageW(GetParent(hWnd
), WM_MOUSEACTIVATE
, wParam
, lParam
);
408 if (Ret
) return (Ret
);
410 return ( (HIWORD(lParam
) == WM_LBUTTONDOWN
&& LOWORD(lParam
) == HTCAPTION
) ? MA_NOACTIVATE
: MA_ACTIVATE
);
413 /* The default action in Windows is to set the keyboard focus to
414 * the window, if it's being activated and not minimized */
415 if (LOWORD(wParam
) != WA_INACTIVE
&&
416 !(GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
))
418 //ERR("WM_ACTIVATE %p\n",hWnd);
424 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
425 return SendMessageW( GetParent(hWnd
), WM_MOUSEWHEEL
, wParam
, lParam
);
429 case WM_ICONERASEBKGND
:
432 HBRUSH hBrush
= (HBRUSH
)GetClassLongPtrW(hWnd
, GCL_HBRBACKGROUND
);
438 if (GetClassLongPtrW(hWnd
, GCL_STYLE
) & CS_PARENTDC
)
440 /* can't use GetClipBox with a parent DC or we fill the whole parent */
441 GetClientRect(hWnd
, &Rect
);
442 DPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
446 GetClipBox((HDC
)wParam
, &Rect
);
448 FillRect((HDC
)wParam
, &Rect
, hBrush
);
452 case WM_CTLCOLORMSGBOX
:
453 case WM_CTLCOLOREDIT
:
454 case WM_CTLCOLORLISTBOX
:
457 case WM_CTLCOLORSTATIC
:
458 case WM_CTLCOLORSCROLLBAR
:
459 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
462 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
465 return (DefWndHandleSysCommand(hWnd
, wParam
, lParam
));
474 case WM_QUERYDROPOBJECT
:
476 if (GetWindowLongPtrW(hWnd
, GWL_EXSTYLE
) & WS_EX_ACCEPTFILES
)
483 case WM_QUERYDRAGICON
:
488 hIcon
= (HICON
)GetClassLongPtrW(hWnd
, GCL_HICON
);
491 return ((LRESULT
)hIcon
);
493 for (Len
= 1; Len
< 64; Len
++)
495 if ((hIcon
= LoadIconW(NULL
, MAKEINTRESOURCEW(Len
))) != NULL
)
497 return((LRESULT
)hIcon
);
500 return ((LRESULT
)LoadIconW(0, IDI_APPLICATION
));
503 case WM_ISACTIVEICON
:
506 isai
= (pWnd
->state
& WNDS_ACTIVEFRAME
) != 0;
510 case WM_NOTIFYFORMAT
:
512 if (lParam
== NF_QUERY
)
513 return IsWindowUnicode(hWnd
) ? NFR_UNICODE
: NFR_ANSI
;
519 return DefWndGetIcon(pWnd
, wParam
, lParam
);
526 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
530 SendMessageA(GetParent(hWnd
), Msg
, wParam
, lParam
);
536 case WM_QUERYENDSESSION
:
541 case WM_INPUTLANGCHANGEREQUEST
:
545 if(wParam
& INPUTLANGCHANGE_BACKWARD
546 && wParam
& INPUTLANGCHANGE_FORWARD
)
551 //FIXME: What to do with INPUTLANGCHANGE_SYSCHARSET ?
553 if(wParam
& INPUTLANGCHANGE_BACKWARD
) NewHkl
= (HKL
) HKL_PREV
;
554 else if(wParam
& INPUTLANGCHANGE_FORWARD
) NewHkl
= (HKL
) HKL_NEXT
;
555 else NewHkl
= (HKL
) lParam
;
557 NtUserActivateKeyboardLayout(NewHkl
, 0);
562 case WM_INPUTLANGCHANGE
:
565 HWND
*win_array
= WIN_ListChildren( hWnd
);
569 while (win_array
[count
])
570 SendMessageW( win_array
[count
++], WM_INPUTLANGCHANGE
, wParam
, lParam
);
571 HeapFree(GetProcessHeap(),0,win_array
);
575 case WM_QUERYUISTATE
:
578 PWND Wnd
= ValidateHwnd(hWnd
);
582 Ret
|= UISF_HIDEFOCUS
;
584 Ret
|= UISF_HIDEACCEL
;
589 case WM_CHANGEUISTATE
:
591 BOOL AlwaysShowCues
= FALSE
;
592 WORD Action
= LOWORD(wParam
);
593 WORD Flags
= HIWORD(wParam
);
596 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
600 Wnd
= ValidateHwnd(hWnd
);
601 if (!Wnd
|| lParam
!= 0)
604 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
607 if (Flags
& UISF_ACTIVE
)
609 WARN("WM_CHANGEUISTATE does not yet support UISF_ACTIVE!\n");
612 if (Action
== UIS_INITIALIZE
)
614 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
618 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
619 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
621 /* We need to update wParam in case we need to send out messages */
622 wParam
= MAKEWPARAM(Action
, Flags
);
628 /* See if we actually need to change something */
629 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
631 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
634 /* Don't need to do anything... */
638 /* See if we actually need to change something */
639 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
641 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
644 /* Don't need to do anything... */
648 WARN("WM_CHANGEUISTATE: Unsupported Action 0x%x\n", Action
);
652 if ((Wnd
->style
& WS_CHILD
) && Wnd
->spwndParent
!= NULL
)
654 /* We're a child window and we need to pass this message down until
656 hWnd
= UserHMGetHandle((PWND
)DesktopPtrToUser(Wnd
->spwndParent
));
660 /* We're a top level window, we need to change the UI state */
661 Msg
= WM_UPDATEUISTATE
;
665 return SendMessageW(hWnd
, Msg
, wParam
, lParam
);
667 return SendMessageA(hWnd
, Msg
, wParam
, lParam
);
670 case WM_UPDATEUISTATE
:
673 BOOL AlwaysShowCues
= FALSE
;
674 WORD Action
= LOWORD(wParam
);
675 WORD Flags
= HIWORD(wParam
);
678 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
682 Wnd
= ValidateHwnd(hWnd
);
683 if (!Wnd
|| lParam
!= 0)
686 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
689 if (Flags
& UISF_ACTIVE
)
691 WARN("WM_UPDATEUISTATE does not yet support UISF_ACTIVE!\n");
694 if (Action
== UIS_INITIALIZE
)
696 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
700 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
701 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
703 /* We need to update wParam for broadcasting the update */
704 wParam
= MAKEWPARAM(Action
, Flags
);
710 /* See if we actually need to change something */
711 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
713 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
716 /* Don't need to do anything... */
721 /* See if we actually need to change something */
722 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
724 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
727 /* Don't need to do anything... */
732 WARN("WM_UPDATEUISTATE: Unsupported Action 0x%x\n", Action
);
736 /* Pack the information and call win32k */
739 if (!NtUserxUpdateUiState(hWnd
, Flags
| ((DWORD
)Action
<< 3)))
743 /* Always broadcast the update to all children */
744 EnumChildWindows(hWnd
,
751 /* Move to Win32k !*/
753 if (!lParam
) break; // Call when it is necessary.
757 case WM_NCLBUTTONDOWN
:
758 case WM_NCRBUTTONDOWN
:
759 case WM_LBUTTONDBLCLK
:
760 case WM_NCLBUTTONDBLCLK
:
772 case WM_SYSCOLORCHANGE
:
773 case WM_NCUAHDRAWCAPTION
:
774 case WM_NCUAHDRAWFRAME
:
781 case WM_CLIENTSHUTDOWN
:
784 case WM_WINDOWPOSCHANGING
:
785 case WM_WINDOWPOSCHANGED
:
791 NtUserMessageCall( hWnd
, Msg
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, !bUnicode
);
800 RealDefWindowProcA(HWND hWnd
,
808 Wnd
= ValidateHwnd(hWnd
);
811 Msg
!= WM_CTLCOLORMSGBOX
&&
812 Msg
!= WM_CTLCOLORBTN
&&
813 Msg
!= WM_CTLCOLORDLG
&&
814 Msg
!= WM_CTLCOLORSTATIC
)
817 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
823 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
827 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
828 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
829 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
835 LPCREATESTRUCTA cs
= (LPCREATESTRUCTA
)lParam
;
836 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
837 * may have child window IDs instead of window name */
838 if (HIWORD(cs
->lpszName
))
840 DefSetText(hWnd
, (PCWSTR
)cs
->lpszName
, TRUE
);
847 case WM_GETTEXTLENGTH
:
852 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
854 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
856 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
858 Wnd
->strName
.Length
)))
860 Result
= (LRESULT
) len
;
871 PSTR outbuf
= (PSTR
)lParam
;
874 if (Wnd
!= NULL
&& wParam
!= 0)
876 if (Wnd
->strName
.Buffer
!= NULL
)
877 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
883 if (Wnd
->strName
.Length
!= 0)
885 copy
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
886 Result
= WideCharToMultiByte(CP_ACP
,
894 outbuf
[Result
] = '\0';
905 DefSetText(hWnd
, (PCWSTR
)lParam
, TRUE
);
907 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
909 UserPaintCaption(Wnd
, DC_TEXT
);
910 IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE
, hWnd
, OBJID_WINDOW
, CHILDID_SELF
, 0);
918 Result
= PostMessageA(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
924 Result
= PostMessageA(hWnd
, WM_KEYUP
, wParam
, lParam
);
931 PostMessageA(hWnd
, WM_CHAR
, HIBYTE(wParam
), lParam
);
932 PostMessageA(hWnd
, WM_CHAR
, LOBYTE(wParam
), lParam
);
936 case WM_IME_COMPOSITION
:
937 if (lParam
& GCS_RESULTSTR
)
940 unsigned char lead
= 0;
942 HIMC himc
= ImmGetContext( hWnd
);
946 if ((size
= ImmGetCompositionStringA( himc
, GCS_RESULTSTR
, NULL
, 0 )))
948 if (!(buf
= HeapAlloc( GetProcessHeap(), 0, size
))) size
= 0;
949 else size
= ImmGetCompositionStringA( himc
, GCS_RESULTSTR
, buf
, size
);
951 ImmReleaseContext( hWnd
, himc
);
953 for (i
= 0; i
< size
; i
++)
955 unsigned char c
= buf
[i
];
958 if (IsDBCSLeadByte( c
))
961 SendMessageA( hWnd
, WM_IME_CHAR
, c
, 1 );
965 SendMessageA( hWnd
, WM_IME_CHAR
, MAKEWORD(c
, lead
), 1 );
969 HeapFree( GetProcessHeap(), 0, buf
);
973 case WM_IME_STARTCOMPOSITION
:
974 case WM_IME_ENDCOMPOSITION
:
981 hwndIME
= ImmGetDefaultIMEWnd(hWnd
);
983 Result
= SendMessageA(hwndIME
, Msg
, wParam
, lParam
);
987 case WM_IME_SETCONTEXT
:
991 hwndIME
= ImmGetDefaultIMEWnd(hWnd
);
993 Result
= ImmIsUIMessageA(hwndIME
, Msg
, wParam
, lParam
);
999 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, FALSE
);
1002 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1008 RealDefWindowProcW(HWND hWnd
,
1016 Wnd
= ValidateHwnd(hWnd
);
1019 Msg
!= WM_CTLCOLORMSGBOX
&&
1020 Msg
!= WM_CTLCOLORBTN
&&
1021 Msg
!= WM_CTLCOLORDLG
&&
1022 Msg
!= WM_CTLCOLORSTATIC
)
1025 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1031 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
1035 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
1036 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
1037 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
1043 LPCREATESTRUCTW cs
= (LPCREATESTRUCTW
)lParam
;
1044 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1045 * may have child window IDs instead of window name */
1046 if (HIWORD(cs
->lpszName
))
1048 DefSetText(hWnd
, cs
->lpszName
, FALSE
);
1055 case WM_GETTEXTLENGTH
:
1060 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
1062 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1064 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1066 Wnd
->strName
.Length
)))
1068 Result
= (LRESULT
) (Wnd
->strName
.Length
/ sizeof(WCHAR
));
1079 PWSTR outbuf
= (PWSTR
)lParam
;
1081 if (Wnd
!= NULL
&& wParam
!= 0)
1083 if (Wnd
->strName
.Buffer
!= NULL
)
1084 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1090 if (Wnd
->strName
.Length
!= 0)
1092 Result
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1093 RtlCopyMemory(outbuf
,
1095 Result
* sizeof(WCHAR
));
1096 outbuf
[Result
] = L
'\0';
1107 DefSetText(hWnd
, (PCWSTR
)lParam
, FALSE
);
1109 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1110 UserPaintCaption(Wnd
, DC_TEXT
);
1117 PostMessageW(hWnd
, WM_CHAR
, wParam
, lParam
);
1122 case WM_IME_KEYDOWN
:
1124 Result
= PostMessageW(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
1130 Result
= PostMessageW(hWnd
, WM_KEYUP
, wParam
, lParam
);
1134 case WM_IME_COMPOSITION
:
1135 if (lParam
& GCS_RESULTSTR
)
1139 HIMC himc
= ImmGetContext( hWnd
);
1143 if ((size
= ImmGetCompositionStringW( himc
, GCS_RESULTSTR
, NULL
, 0 )))
1145 if (!(buf
= HeapAlloc( GetProcessHeap(), 0, size
* sizeof(WCHAR
) ))) size
= 0;
1146 else size
= ImmGetCompositionStringW( himc
, GCS_RESULTSTR
, buf
, size
* sizeof(WCHAR
) );
1148 ImmReleaseContext( hWnd
, himc
);
1150 for (i
= 0; i
< size
/ sizeof(WCHAR
); i
++)
1151 SendMessageW( hWnd
, WM_IME_CHAR
, buf
[i
], 1 );
1152 HeapFree( GetProcessHeap(), 0, buf
);
1156 case WM_IME_STARTCOMPOSITION
:
1157 case WM_IME_ENDCOMPOSITION
:
1160 case WM_IME_CONTROL
:
1164 hwndIME
= ImmGetDefaultIMEWnd(hWnd
);
1166 Result
= SendMessageW(hwndIME
, Msg
, wParam
, lParam
);
1170 case WM_IME_SETCONTEXT
:
1174 hwndIME
= ImmGetDefaultIMEWnd(hWnd
);
1176 Result
= ImmIsUIMessageW(hwndIME
, Msg
, wParam
, lParam
);
1181 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, TRUE
);
1183 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1189 DefWindowProcA(HWND hWnd
,
1194 BOOL Hook
, msgOverride
= FALSE
;
1199 Hook
= BeginIfHookedUserApiHook();
1202 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1203 if(msgOverride
== FALSE
)
1209 /* Bypass SEH and go direct. */
1210 if (!Hook
|| !msgOverride
)
1211 return RealDefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1215 Result
= guah
.DefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1217 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1219 ERR("Got exception in hooked DefWindowProcA!\n");
1229 DefWindowProcW(HWND hWnd
,
1234 BOOL Hook
, msgOverride
= FALSE
;
1239 Hook
= BeginIfHookedUserApiHook();
1242 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1243 if(msgOverride
== FALSE
)
1249 /* Bypass SEH and go direct. */
1250 if (!Hook
|| !msgOverride
)
1251 return RealDefWindowProcW(hWnd
, Msg
, wParam
, lParam
);
1255 Result
= guah
.DefWindowProcW(hWnd
, Msg
, wParam
, lParam
);
1257 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1259 ERR("Got exception in hooked DefWindowProcW!\n");