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 #include <wine/debug.h>
15 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
23 GetSysColor(int nIndex
)
25 if(nIndex
>= 0 && nIndex
< NUM_SYSCOLORS
)
27 return gpsi
->argbSystem
[nIndex
];
30 SetLastError(ERROR_INVALID_PARAMETER
);
40 GetSysColorBrush(int nIndex
)
42 if(nIndex
>= 0 && nIndex
< NUM_SYSCOLORS
)
44 return gpsi
->ahbrSystem
[nIndex
];
57 CONST INT
*lpaElements
,
58 CONST COLORREF
*lpaRgbValues
)
60 return NtUserSetSysColors(cElements
, lpaElements
, lpaRgbValues
, 0);
65 DefSetText(HWND hWnd
, PCWSTR String
, BOOL Ansi
)
68 LARGE_STRING lsString
;
73 RtlInitLargeAnsiString((PLARGE_ANSI_STRING
)&lsString
, (PCSZ
)String
, 0);
75 RtlInitLargeUnicodeString((PLARGE_UNICODE_STRING
)&lsString
, String
, 0);
77 Ret
= NtUserDefSetText(hWnd
, (String
? &lsString
: NULL
));
83 IntFindChildWindowToOwner(HWND hRoot
, HWND hOwner
)
86 PWND Child
, OwnerWnd
, Root
, Owner
;
88 Root
= ValidateHwnd(hRoot
);
89 Owner
= ValidateHwnd(hOwner
);
91 for( Child
= Root
->spwndChild
? DesktopPtrToUser(Root
->spwndChild
) : NULL
;
93 Child
= Child
->spwndNext
? DesktopPtrToUser(Child
->spwndNext
) : NULL
)
95 OwnerWnd
= Child
->spwndOwner
? DesktopPtrToUser(Child
->spwndOwner
) : NULL
;
99 if (!(Child
->style
& WS_POPUP
) || !(Child
->style
& WS_VISIBLE
))
102 if(OwnerWnd
== Owner
)
108 ERR("IDCWTO Nothing found\n");
112 /***********************************************************************
113 * DefWndTrackScrollBar
115 * Track a mouse button press on the horizontal or vertical scroll-bar.
118 DefWndTrackScrollBar(HWND Wnd
, WPARAM wParam
, POINT Pt
)
122 if (SC_HSCROLL
== (wParam
& 0xfff0))
124 if (HTHSCROLL
!= (wParam
& 0x0f))
130 else /* SC_VSCROLL */
132 if (HTVSCROLL
!= (wParam
& 0x0f))
138 ScrollTrackScrollBar(Wnd
, ScrollBar
, Pt
);
141 LRESULT WINAPI
DoAppSwitch( WPARAM wParam
, LPARAM lParam
);
144 DefWndHandleSysCommand(HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
149 if (!IsWindowEnabled( hWnd
)) return 0;
151 switch (wParam
& 0xfff0)
164 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
171 if (ISITHOOKED(WH_CBT
))
173 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
174 if (lResult
) return 0;
177 switch (wParam
& 0xfff0)
183 Pt
.x
= (short)LOWORD(lParam
);
184 Pt
.y
= (short)HIWORD(lParam
);
185 DefWndTrackScrollBar(hWnd
, wParam
, Pt
);
190 WinExec( "taskman.exe", SW_SHOWNORMAL
);
196 DoAppSwitch( wParam
, lParam
);
200 FIXME("Unimplemented DefWndHandleSysCommand wParam 0x%x\n",wParam
);
207 /***********************************************************************
210 * Default colors for control painting.
213 DefWndControlColor(HDC hDC
, UINT ctlType
)
215 if (ctlType
== CTLCOLOR_SCROLLBAR
)
217 HBRUSH hb
= GetSysColorBrush(COLOR_SCROLLBAR
);
218 COLORREF bk
= GetSysColor(COLOR_3DHILIGHT
);
219 SetTextColor(hDC
, GetSysColor(COLOR_3DFACE
));
222 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
223 * we better use 0x55aa bitmap brush to make scrollbar's background
224 * look different from the window background.
226 if ( bk
== GetSysColor(COLOR_WINDOW
))
227 return gpsi
->hbrGray
;
229 UnrealizeObject( hb
);
233 SetTextColor(hDC
, GetSysColor(COLOR_WINDOWTEXT
));
235 if ((ctlType
== CTLCOLOR_EDIT
) || (ctlType
== CTLCOLOR_LISTBOX
))
237 SetBkColor(hDC
, GetSysColor(COLOR_WINDOW
));
241 SetBkColor(hDC
, GetSysColor(COLOR_3DFACE
));
242 return GetSysColorBrush(COLOR_3DFACE
);
245 return GetSysColorBrush(COLOR_WINDOW
);
249 UserSendUiUpdateMsg(HWND hwnd
, LPARAM lParam
)
251 SendMessageW(hwnd
, WM_UPDATEUISTATE
, (WPARAM
)lParam
, 0);
255 /* WARNING: Redundant with /ntuser/defwnd.c!UserPaintCaption !!
256 Use TWOPARAM_ROUTINE_REDRAWTITLE/REDRAWFRAME or HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK .
259 UserPaintCaption(PWND pwnd
, INT Flags
)
261 if ( pwnd
->style
& WS_VISIBLE
&& (pwnd
->style
& WS_CAPTION
) == WS_CAPTION
)
263 if (pwnd
->state
& WNDS_HASCAPTION
&& NtUserQueryWindow(UserHMGetHandle(pwnd
), QUERY_WINDOW_FOREGROUND
))
266 * When themes are not enabled we can go on and paint the non client area.
267 * However if we do that with themes enabled we will draw a classic frame.
268 * This is solved by sending a themes specific message to notify the themes
269 * engine that the caption needs to be redrawn
271 if(gpsi
->dwSRVIFlags
& SRVINFO_APIHOOK
)
274 * This will cause uxtheme to either paint the themed caption or call
275 * RealUserDrawCaption in order to draw the classic caption when themes
276 * are disabled but the themes service is enabled
278 SendMessageW(UserHMGetHandle(pwnd
), WM_NCUAHDRAWCAPTION
, Flags
, 0);
283 HDC hDC
= GetDCEx(UserHMGetHandle(pwnd
), NULL
, DCX_WINDOW
|DCX_USESTYLE
);
284 NtUserDrawCaption(UserHMGetHandle(pwnd
), hDC
, &rc
, DC_DRAWCAPTIONMD
|Flags
);
285 ReleaseDC(UserHMGetHandle(pwnd
), hDC
);
288 //NtUserCallTwoParam((DWORD_PTR)UserHMGetHandle(pwnd),Flags,TWOPARAM_ROUTINE_REDRAWTITLE)
292 DefWndGetIcon(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
295 if ( wParam
> ICON_SMALL2
)
297 SetLastError(ERROR_INVALID_PARAMETER
);
303 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconProp
, TRUE
);
307 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconSmProp
, TRUE
);
312 return (LRESULT
)hIconRet
;
317 User32DefWindowProc(HWND hWnd
,
326 pWnd
= ValidateHwnd(hWnd
);
332 case WM_POPUPSYSTEMMENU
:
334 /* This is an undocumented message used by the windows taskbar to
335 display the system menu of windows that belong to other processes. */
336 HMENU menu
= GetSystemMenu(hWnd
, FALSE
);
337 ERR("WM_POPUPSYSTEMMENU\n");
339 TrackPopupMenu(menu
, TPM_LEFTBUTTON
|TPM_RIGHTBUTTON
|TPM_SYSTEM_MENU
,
340 LOWORD(lParam
), HIWORD(lParam
), 0, hWnd
, NULL
);
347 Pt
.x
= GET_X_LPARAM(lParam
);
348 Pt
.y
= GET_Y_LPARAM(lParam
);
349 ClientToScreen(hWnd
, &Pt
);
350 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
353 SendMessageW(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
357 SendMessageA(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
364 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
365 * in Windows), but what _should_ we do? According to MSDN :
366 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
367 * message to the window". When is it appropriate?
369 ERR("WM_NCRBUTTONUP\n");
374 if (HIWORD(wParam
) == XBUTTON1
|| HIWORD(wParam
) == XBUTTON2
)
376 SendMessageW(hWnd
, WM_APPCOMMAND
, (WPARAM
)hWnd
,
377 MAKELPARAM(LOWORD(wParam
), FAPPCOMMAND_MOUSE
| HIWORD(wParam
)));
383 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
387 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
391 SendMessageA(GetParent(hWnd
), WM_CONTEXTMENU
, wParam
, lParam
);
405 case WM_MOUSEACTIVATE
:
406 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
408 LONG Ret
= SendMessageW(GetParent(hWnd
), WM_MOUSEACTIVATE
, wParam
, lParam
);
409 if (Ret
) return (Ret
);
411 return ( (HIWORD(lParam
) == WM_LBUTTONDOWN
&& LOWORD(lParam
) == HTCAPTION
) ? MA_NOACTIVATE
: MA_ACTIVATE
);
414 /* The default action in Windows is to set the keyboard focus to
415 * the window, if it's being activated and not minimized */
416 if (LOWORD(wParam
) != WA_INACTIVE
&&
417 !(GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
))
419 //ERR("WM_ACTIVATE %p\n",hWnd);
425 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
426 return SendMessageW( GetParent(hWnd
), WM_MOUSEWHEEL
, wParam
, lParam
);
430 case WM_ICONERASEBKGND
:
433 HBRUSH hBrush
= (HBRUSH
)GetClassLongPtrW(hWnd
, GCL_HBRBACKGROUND
);
439 if (GetClassLongPtrW(hWnd
, GCL_STYLE
) & CS_PARENTDC
)
441 /* can't use GetClipBox with a parent DC or we fill the whole parent */
442 GetClientRect(hWnd
, &Rect
);
443 DPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
447 GetClipBox((HDC
)wParam
, &Rect
);
449 FillRect((HDC
)wParam
, &Rect
, hBrush
);
453 case WM_CTLCOLORMSGBOX
:
454 case WM_CTLCOLOREDIT
:
455 case WM_CTLCOLORLISTBOX
:
458 case WM_CTLCOLORSTATIC
:
459 case WM_CTLCOLORSCROLLBAR
:
460 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
463 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
466 return (DefWndHandleSysCommand(hWnd
, wParam
, lParam
));
475 case WM_QUERYDROPOBJECT
:
477 if (GetWindowLongPtrW(hWnd
, GWL_EXSTYLE
) & WS_EX_ACCEPTFILES
)
484 case WM_QUERYDRAGICON
:
489 hIcon
= (HICON
)GetClassLongPtrW(hWnd
, GCL_HICON
);
492 return ((LRESULT
)hIcon
);
494 for (Len
= 1; Len
< 64; Len
++)
496 if ((hIcon
= LoadIconW(NULL
, MAKEINTRESOURCEW(Len
))) != NULL
)
498 return((LRESULT
)hIcon
);
501 return ((LRESULT
)LoadIconW(0, IDI_APPLICATION
));
504 case WM_ISACTIVEICON
:
507 isai
= (pWnd
->state
& WNDS_ACTIVEFRAME
) != 0;
511 case WM_NOTIFYFORMAT
:
513 if (lParam
== NF_QUERY
)
514 return IsWindowUnicode(hWnd
) ? NFR_UNICODE
: NFR_ANSI
;
520 return DefWndGetIcon(pWnd
, wParam
, lParam
);
527 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
531 SendMessageA(GetParent(hWnd
), Msg
, wParam
, lParam
);
537 case WM_QUERYENDSESSION
:
542 case WM_INPUTLANGCHANGEREQUEST
:
546 if(wParam
& INPUTLANGCHANGE_BACKWARD
547 && wParam
& INPUTLANGCHANGE_FORWARD
)
552 //FIXME: What to do with INPUTLANGCHANGE_SYSCHARSET ?
554 if(wParam
& INPUTLANGCHANGE_BACKWARD
) NewHkl
= (HKL
) HKL_PREV
;
555 else if(wParam
& INPUTLANGCHANGE_FORWARD
) NewHkl
= (HKL
) HKL_NEXT
;
556 else NewHkl
= (HKL
) lParam
;
558 NtUserActivateKeyboardLayout(NewHkl
, 0);
563 case WM_INPUTLANGCHANGE
:
566 HWND
*win_array
= WIN_ListChildren( hWnd
);
570 while (win_array
[count
])
571 SendMessageW( win_array
[count
++], WM_INPUTLANGCHANGE
, wParam
, lParam
);
572 HeapFree(GetProcessHeap(),0,win_array
);
576 case WM_QUERYUISTATE
:
579 PWND Wnd
= ValidateHwnd(hWnd
);
583 Ret
|= UISF_HIDEFOCUS
;
585 Ret
|= UISF_HIDEACCEL
;
590 case WM_CHANGEUISTATE
:
592 BOOL AlwaysShowCues
= FALSE
;
593 WORD Action
= LOWORD(wParam
);
594 WORD Flags
= HIWORD(wParam
);
597 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
601 Wnd
= ValidateHwnd(hWnd
);
602 if (!Wnd
|| lParam
!= 0)
605 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
608 if (Flags
& UISF_ACTIVE
)
610 WARN("WM_CHANGEUISTATE does not yet support UISF_ACTIVE!\n");
613 if (Action
== UIS_INITIALIZE
)
615 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
619 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
620 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
622 /* We need to update wParam in case we need to send out messages */
623 wParam
= MAKEWPARAM(Action
, Flags
);
629 /* See if we actually need to change something */
630 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
632 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
635 /* Don't need to do anything... */
639 /* See if we actually need to change something */
640 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
642 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
645 /* Don't need to do anything... */
649 WARN("WM_CHANGEUISTATE: Unsupported Action 0x%x\n", Action
);
653 if ((Wnd
->style
& WS_CHILD
) && Wnd
->spwndParent
!= NULL
)
655 /* We're a child window and we need to pass this message down until
657 hWnd
= UserHMGetHandle((PWND
)DesktopPtrToUser(Wnd
->spwndParent
));
661 /* We're a top level window, we need to change the UI state */
662 Msg
= WM_UPDATEUISTATE
;
666 return SendMessageW(hWnd
, Msg
, wParam
, lParam
);
668 return SendMessageA(hWnd
, Msg
, wParam
, lParam
);
671 case WM_UPDATEUISTATE
:
674 BOOL AlwaysShowCues
= FALSE
;
675 WORD Action
= LOWORD(wParam
);
676 WORD Flags
= HIWORD(wParam
);
679 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
683 Wnd
= ValidateHwnd(hWnd
);
684 if (!Wnd
|| lParam
!= 0)
687 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
690 if (Flags
& UISF_ACTIVE
)
692 WARN("WM_UPDATEUISTATE does not yet support UISF_ACTIVE!\n");
695 if (Action
== UIS_INITIALIZE
)
697 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
701 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
702 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
704 /* We need to update wParam for broadcasting the update */
705 wParam
= MAKEWPARAM(Action
, Flags
);
711 /* See if we actually need to change something */
712 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
714 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
717 /* Don't need to do anything... */
722 /* See if we actually need to change something */
723 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
725 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
728 /* Don't need to do anything... */
733 WARN("WM_UPDATEUISTATE: Unsupported Action 0x%x\n", Action
);
737 /* Pack the information and call win32k */
740 if (!NtUserxUpdateUiState(hWnd
, Flags
| ((DWORD
)Action
<< 3)))
744 /* Always broadcast the update to all children */
745 EnumChildWindows(hWnd
,
752 /* Move to Win32k !*/
754 if (!lParam
) break; // Call when it is necessary.
758 case WM_NCLBUTTONDOWN
:
759 case WM_NCRBUTTONDOWN
:
760 case WM_LBUTTONDBLCLK
:
761 case WM_NCLBUTTONDBLCLK
:
773 case WM_SYSCOLORCHANGE
:
774 case WM_NCUAHDRAWCAPTION
:
775 case WM_NCUAHDRAWFRAME
:
782 case WM_CLIENTSHUTDOWN
:
785 case WM_WINDOWPOSCHANGING
:
786 case WM_WINDOWPOSCHANGED
:
792 NtUserMessageCall( hWnd
, Msg
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, !bUnicode
);
801 RealDefWindowProcA(HWND hWnd
,
809 Wnd
= ValidateHwnd(hWnd
);
812 Msg
!= WM_CTLCOLORMSGBOX
&&
813 Msg
!= WM_CTLCOLORBTN
&&
814 Msg
!= WM_CTLCOLORDLG
&&
815 Msg
!= WM_CTLCOLORSTATIC
)
818 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
824 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
828 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
829 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
830 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
836 LPCREATESTRUCTA cs
= (LPCREATESTRUCTA
)lParam
;
837 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
838 * may have child window IDs instead of window name */
839 if (HIWORD(cs
->lpszName
))
841 DefSetText(hWnd
, (PCWSTR
)cs
->lpszName
, TRUE
);
848 case WM_GETTEXTLENGTH
:
853 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
855 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
857 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
859 Wnd
->strName
.Length
)))
861 Result
= (LRESULT
) len
;
872 PSTR outbuf
= (PSTR
)lParam
;
875 if (Wnd
!= NULL
&& wParam
!= 0)
877 if (Wnd
->strName
.Buffer
!= NULL
)
878 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
884 if (Wnd
->strName
.Length
!= 0)
886 copy
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
887 Result
= WideCharToMultiByte(CP_ACP
,
895 outbuf
[Result
] = '\0';
906 DefSetText(hWnd
, (PCWSTR
)lParam
, TRUE
);
908 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
910 UserPaintCaption(Wnd
, DC_TEXT
);
911 IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE
, hWnd
, OBJID_WINDOW
, CHILDID_SELF
, 0);
919 Result
= PostMessageA(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
925 Result
= PostMessageA(hWnd
, WM_KEYUP
, wParam
, lParam
);
932 PostMessageA(hWnd
, WM_CHAR
, HIBYTE(wParam
), lParam
);
933 PostMessageA(hWnd
, WM_CHAR
, LOBYTE(wParam
), lParam
);
937 case WM_IME_COMPOSITION
:
938 if (lParam
& GCS_RESULTSTR
)
941 unsigned char lead
= 0;
943 HIMC himc
= ImmGetContext( hWnd
);
947 if ((size
= ImmGetCompositionStringA( himc
, GCS_RESULTSTR
, NULL
, 0 )))
949 if (!(buf
= HeapAlloc( GetProcessHeap(), 0, size
))) size
= 0;
950 else size
= ImmGetCompositionStringA( himc
, GCS_RESULTSTR
, buf
, size
);
952 ImmReleaseContext( hWnd
, himc
);
954 for (i
= 0; i
< size
; i
++)
956 unsigned char c
= buf
[i
];
959 if (IsDBCSLeadByte( c
))
962 SendMessageA( hWnd
, WM_IME_CHAR
, c
, 1 );
966 SendMessageA( hWnd
, WM_IME_CHAR
, MAKEWORD(c
, lead
), 1 );
970 HeapFree( GetProcessHeap(), 0, buf
);
974 case WM_IME_STARTCOMPOSITION
:
975 case WM_IME_ENDCOMPOSITION
:
982 hwndIME
= ImmGetDefaultIMEWnd(hWnd
);
984 Result
= SendMessageA(hwndIME
, Msg
, wParam
, lParam
);
988 case WM_IME_SETCONTEXT
:
992 hwndIME
= ImmGetDefaultIMEWnd(hWnd
);
994 Result
= ImmIsUIMessageA(hwndIME
, Msg
, wParam
, lParam
);
1000 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, FALSE
);
1003 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1009 RealDefWindowProcW(HWND hWnd
,
1017 Wnd
= ValidateHwnd(hWnd
);
1020 Msg
!= WM_CTLCOLORMSGBOX
&&
1021 Msg
!= WM_CTLCOLORBTN
&&
1022 Msg
!= WM_CTLCOLORDLG
&&
1023 Msg
!= WM_CTLCOLORSTATIC
)
1026 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1032 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
1036 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
1037 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
1038 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
1044 LPCREATESTRUCTW cs
= (LPCREATESTRUCTW
)lParam
;
1045 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1046 * may have child window IDs instead of window name */
1047 if (HIWORD(cs
->lpszName
))
1049 DefSetText(hWnd
, cs
->lpszName
, FALSE
);
1056 case WM_GETTEXTLENGTH
:
1061 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
1063 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1065 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1067 Wnd
->strName
.Length
)))
1069 Result
= (LRESULT
) (Wnd
->strName
.Length
/ sizeof(WCHAR
));
1080 PWSTR outbuf
= (PWSTR
)lParam
;
1082 if (Wnd
!= NULL
&& wParam
!= 0)
1084 if (Wnd
->strName
.Buffer
!= NULL
)
1085 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1091 if (Wnd
->strName
.Length
!= 0)
1093 Result
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1094 RtlCopyMemory(outbuf
,
1096 Result
* sizeof(WCHAR
));
1097 outbuf
[Result
] = L
'\0';
1108 DefSetText(hWnd
, (PCWSTR
)lParam
, FALSE
);
1110 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1111 UserPaintCaption(Wnd
, DC_TEXT
);
1118 PostMessageW(hWnd
, WM_CHAR
, wParam
, lParam
);
1123 case WM_IME_KEYDOWN
:
1125 Result
= PostMessageW(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
1131 Result
= PostMessageW(hWnd
, WM_KEYUP
, wParam
, lParam
);
1135 case WM_IME_COMPOSITION
:
1136 if (lParam
& GCS_RESULTSTR
)
1140 HIMC himc
= ImmGetContext( hWnd
);
1144 if ((size
= ImmGetCompositionStringW( himc
, GCS_RESULTSTR
, NULL
, 0 )))
1146 if (!(buf
= HeapAlloc( GetProcessHeap(), 0, size
* sizeof(WCHAR
) ))) size
= 0;
1147 else size
= ImmGetCompositionStringW( himc
, GCS_RESULTSTR
, buf
, size
* sizeof(WCHAR
) );
1149 ImmReleaseContext( hWnd
, himc
);
1151 for (i
= 0; i
< size
/ sizeof(WCHAR
); i
++)
1152 SendMessageW( hWnd
, WM_IME_CHAR
, buf
[i
], 1 );
1153 HeapFree( GetProcessHeap(), 0, buf
);
1157 case WM_IME_STARTCOMPOSITION
:
1158 case WM_IME_ENDCOMPOSITION
:
1161 case WM_IME_CONTROL
:
1165 hwndIME
= ImmGetDefaultIMEWnd(hWnd
);
1167 Result
= SendMessageW(hwndIME
, Msg
, wParam
, lParam
);
1171 case WM_IME_SETCONTEXT
:
1175 hwndIME
= ImmGetDefaultIMEWnd(hWnd
);
1177 Result
= ImmIsUIMessageW(hwndIME
, Msg
, wParam
, lParam
);
1182 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, TRUE
);
1184 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1190 DefWindowProcA(HWND hWnd
,
1195 BOOL Hook
, msgOverride
= FALSE
;
1200 Hook
= BeginIfHookedUserApiHook();
1203 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1204 if(msgOverride
== FALSE
)
1210 /* Bypass SEH and go direct. */
1211 if (!Hook
|| !msgOverride
)
1212 return RealDefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1216 Result
= guah
.DefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1218 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
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
)