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 LRESULT
DefWndNCHitTest(HWND hWnd
, POINT Point
);
21 /* GLOBALS *******************************************************************/
23 /* FUNCTIONS *****************************************************************/
31 GetSysColor(int nIndex
)
33 if(nIndex
>= 0 && nIndex
< NUM_SYSCOLORS
)
35 return gpsi
->argbSystem
[nIndex
];
38 SetLastError(ERROR_INVALID_PARAMETER
);
48 GetSysColorBrush(int nIndex
)
50 if(nIndex
>= 0 && nIndex
< NUM_SYSCOLORS
)
52 return gpsi
->ahbrSystem
[nIndex
];
55 SetLastError(ERROR_INVALID_PARAMETER
);
66 CONST INT
*lpaElements
,
67 CONST COLORREF
*lpaRgbValues
)
69 return NtUserSetSysColors(cElements
, lpaElements
, lpaRgbValues
, 0);
74 DefSetText(HWND hWnd
, PCWSTR String
, BOOL Ansi
)
77 LARGE_STRING lsString
;
82 RtlInitLargeAnsiString((PLARGE_ANSI_STRING
)&lsString
, (PCSZ
)String
, 0);
84 RtlInitLargeUnicodeString((PLARGE_UNICODE_STRING
)&lsString
, String
, 0);
86 Ret
= NtUserDefSetText(hWnd
, (String
? &lsString
: NULL
));
92 UserGetInsideRectNC(PWND Wnd
, RECT
*rect
)
98 ExStyle
= Wnd
->ExStyle
;
100 rect
->top
= rect
->left
= 0;
101 rect
->right
= Wnd
->rcWindow
.right
- Wnd
->rcWindow
.left
;
102 rect
->bottom
= Wnd
->rcWindow
.bottom
- Wnd
->rcWindow
.top
;
104 if (Style
& WS_ICONIC
)
109 /* Remove frame from rectangle */
110 if (UserHasThickFrameStyle(Style
, ExStyle
))
112 InflateRect(rect
, -GetSystemMetrics(SM_CXFRAME
), -GetSystemMetrics(SM_CYFRAME
));
116 if (UserHasDlgFrameStyle(Style
, ExStyle
))
118 InflateRect(rect
, -GetSystemMetrics(SM_CXDLGFRAME
), -GetSystemMetrics(SM_CYDLGFRAME
));
119 /* FIXME: this isn't in NC_AdjustRect? why not? */
120 if (ExStyle
& WS_EX_DLGMODALFRAME
)
121 InflateRect( rect
, -1, 0 );
125 if (UserHasThinFrameStyle(Style
, ExStyle
))
127 InflateRect(rect
, -GetSystemMetrics(SM_CXBORDER
), -GetSystemMetrics(SM_CYBORDER
));
131 /* We have additional border information if the window
132 * is a child (but not an MDI child) */
133 if ((Style
& WS_CHILD
) && !(ExStyle
& WS_EX_MDICHILD
))
135 if (ExStyle
& WS_EX_CLIENTEDGE
)
136 InflateRect (rect
, -GetSystemMetrics(SM_CXEDGE
), -GetSystemMetrics(SM_CYEDGE
));
137 if (ExStyle
& WS_EX_STATICEDGE
)
138 InflateRect (rect
, -GetSystemMetrics(SM_CXBORDER
), -GetSystemMetrics(SM_CYBORDER
));
143 IntFindChildWindowToOwner(HWND hRoot
, HWND hOwner
)
146 PWND Child
, OwnerWnd
, Root
, Owner
;
148 Root
= ValidateHwnd(hRoot
);
149 Owner
= ValidateHwnd(hOwner
);
151 for( Child
= Root
->spwndChild
? DesktopPtrToUser(Root
->spwndChild
) : NULL
;
153 Child
= Child
->spwndNext
? DesktopPtrToUser(Child
->spwndNext
) : NULL
)
155 OwnerWnd
= Child
->spwndOwner
? DesktopPtrToUser(Child
->spwndOwner
) : NULL
;
159 if (!(Child
->style
& WS_POPUP
) || !(Child
->style
& WS_VISIBLE
))
162 if(OwnerWnd
== Owner
)
168 ERR("IDCWTO Nothing found\n");
172 /***********************************************************************
173 * DefWndTrackScrollBar
175 * Track a mouse button press on the horizontal or vertical scroll-bar.
178 DefWndTrackScrollBar(HWND Wnd
, WPARAM wParam
, POINT Pt
)
182 if (SC_HSCROLL
== (wParam
& 0xfff0))
184 if (HTHSCROLL
!= (wParam
& 0x0f))
190 else /* SC_VSCROLL */
192 if (HTVSCROLL
!= (wParam
& 0x0f))
198 ScrollTrackScrollBar(Wnd
, ScrollBar
, Pt
);
201 LRESULT WINAPI
DoAppSwitch( WPARAM wParam
, LPARAM lParam
);
204 DefWndHandleSysCommand(HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
209 if (!IsWindowEnabled( hWnd
)) return 0;
211 switch (wParam
& 0xfff0)
219 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
226 if (ISITHOOKED(WH_CBT
))
228 NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, FALSE
);
229 if (lResult
) return 0;
232 switch (wParam
& 0xfff0)
236 if (hWnd
== GetActiveWindow())
237 ShowOwnedPopups(hWnd
,FALSE
);
238 ShowWindow( hWnd
, SW_MINIMIZE
);
242 if (IsIconic(hWnd
) && hWnd
== GetActiveWindow())
243 ShowOwnedPopups(hWnd
,TRUE
);
244 ShowWindow( hWnd
, SW_MAXIMIZE
);
248 if (IsIconic(hWnd
) && hWnd
== GetActiveWindow())
249 ShowOwnedPopups(hWnd
,TRUE
);
250 ShowWindow( hWnd
, SW_RESTORE
);
254 return SendMessageW(hWnd
, WM_CLOSE
, 0, 0);
259 Pt
.x
= (short)LOWORD(lParam
);
260 Pt
.y
= (short)HIWORD(lParam
);
261 DefWndTrackScrollBar(hWnd
, wParam
, Pt
);
266 WinExec( "taskman.exe", SW_SHOWNORMAL
);
272 DoAppSwitch( wParam
, lParam
);
277 HWND hwnd
, hWndLastActive
;
281 pWnd
= ValidateHwnd(hwnd
);
284 hWndLastActive
= GetLastActivePopup(hwnd
);
287 hwnd
= hWndLastActive
;
288 pWnd
= ValidateHwnd(hwnd
);
290 SetForegroundWindow(hwnd
);
291 if (pWnd
->style
& WS_MINIMIZE
)
293 PostMessage(hwnd
, WM_SYSCOMMAND
, SC_RESTORE
, 0);
300 FIXME("Unimplemented DefWndHandleSysCommand wParam 0x%x\n",wParam
);
307 /***********************************************************************
310 * Default colors for control painting.
313 DefWndControlColor(HDC hDC
, UINT ctlType
)
315 if (ctlType
== CTLCOLOR_SCROLLBAR
)
317 HBRUSH hb
= GetSysColorBrush(COLOR_SCROLLBAR
);
318 COLORREF bk
= GetSysColor(COLOR_3DHILIGHT
);
319 SetTextColor(hDC
, GetSysColor(COLOR_3DFACE
));
322 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
323 * we better use 0x55aa bitmap brush to make scrollbar's background
324 * look different from the window background.
326 if ( bk
== GetSysColor(COLOR_WINDOW
))
327 return gpsi
->hbrGray
;
329 UnrealizeObject( hb
);
333 SetTextColor(hDC
, GetSysColor(COLOR_WINDOWTEXT
));
335 if ((ctlType
== CTLCOLOR_EDIT
) || (ctlType
== CTLCOLOR_LISTBOX
))
337 SetBkColor(hDC
, GetSysColor(COLOR_WINDOW
));
341 SetBkColor(hDC
, GetSysColor(COLOR_3DFACE
));
342 return GetSysColorBrush(COLOR_3DFACE
);
345 return GetSysColorBrush(COLOR_WINDOW
);
349 UserSendUiUpdateMsg(HWND hwnd
, LPARAM lParam
)
351 SendMessageW(hwnd
, WM_UPDATEUISTATE
, (WPARAM
)lParam
, 0);
356 UserPaintCaption(PWND pwnd
, INT Flags
)
358 if ( pwnd
->style
& WS_VISIBLE
&& (pwnd
->style
& WS_CAPTION
) == WS_CAPTION
)
360 if (pwnd
->state
& WNDS_HASCAPTION
&& NtUserQueryWindow(UserHMGetHandle(pwnd
), QUERY_WINDOW_FOREGROUND
))
363 * When themes are not enabled we can go on and paint the non client area.
364 * However if we do that with themes enabled we will draw a classic frame.
365 * This is sovled by sending a themes specific message to notify the themes
366 * engine that the caption needs to be redrawn
368 if(gpsi
->dwSRVIFlags
& SRVINFO_APIHOOK
)
371 * This will cause uxtheme to either paint the themed caption or call
372 * RealUserDrawCaption in order to draw the classic caption when themes
373 * are disabled but the themes service is enabled
375 SendMessageW(UserHMGetHandle(pwnd
), WM_NCUAHDRAWCAPTION
, Flags
, 0);
380 HDC hDC
= GetDCEx(UserHMGetHandle(pwnd
), NULL
, DCX_WINDOW
|DCX_USESTYLE
);
381 NtUserDrawCaption(UserHMGetHandle(pwnd
), hDC
, &rc
, DC_DRAWCAPTIONMD
|Flags
);
382 ReleaseDC(UserHMGetHandle(pwnd
), hDC
);
385 //NtUserCallTwoParam((DWORD_PTR)UserHMGetHandle(pwnd),Flags,TWOPARAM_ROUTINE_REDRAWTITLE)
389 DefWndGetIcon(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
392 if ( wParam
> ICON_SMALL2
)
394 SetLastError(ERROR_INVALID_PARAMETER
);
400 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconProp
, TRUE
);
404 hIconRet
= UserGetProp(UserHMGetHandle(pWnd
), gpsi
->atomIconSmProp
, TRUE
);
409 return (LRESULT
)hIconRet
;
414 User32DefWindowProc(HWND hWnd
,
423 pWnd
= ValidateHwnd(hWnd
);
429 case WM_POPUPSYSTEMMENU
:
431 /* This is an undocumented message used by the windows taskbar to
432 display the system menu of windows that belong to other processes. */
433 HMENU menu
= GetSystemMenu(hWnd
, FALSE
);
434 ERR("WM_POPUPSYSTEMMENU\n");
436 TrackPopupMenu(menu
, TPM_LEFTBUTTON
|TPM_RIGHTBUTTON
|TPM_SYSTEM_MENU
,
437 LOWORD(lParam
), HIWORD(lParam
), 0, hWnd
, NULL
);
444 Point
.x
= GET_X_LPARAM(lParam
);
445 Point
.y
= GET_Y_LPARAM(lParam
);
446 return (DefWndNCHitTest(hWnd
, Point
));
452 Pt
.x
= GET_X_LPARAM(lParam
);
453 Pt
.y
= GET_Y_LPARAM(lParam
);
454 ClientToScreen(hWnd
, &Pt
);
455 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
458 SendMessageW(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
462 SendMessageA(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
469 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
470 * in Windows), but what _should_ we do? According to MSDN :
471 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
472 * message to the window". When is it appropriate?
474 ERR("WM_NCRBUTTONUP\n");
479 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
483 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
487 SendMessageA(GetParent(hWnd
), WM_CONTEXTMENU
, wParam
, lParam
);
501 case WM_MOUSEACTIVATE
:
502 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
504 LONG Ret
= SendMessageW(GetParent(hWnd
), WM_MOUSEACTIVATE
, wParam
, lParam
);
505 if (Ret
) return (Ret
);
507 return ( (HIWORD(lParam
) == WM_LBUTTONDOWN
&& LOWORD(lParam
) == HTCAPTION
) ? MA_NOACTIVATE
: MA_ACTIVATE
);
510 /* The default action in Windows is to set the keyboard focus to
511 * the window, if it's being activated and not minimized */
512 if (LOWORD(wParam
) != WA_INACTIVE
&&
513 !(GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
))
515 //ERR("WM_ACTIVATE %p\n",hWnd);
521 if (GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CHILD
)
522 return SendMessageW( GetParent(hWnd
), WM_MOUSEWHEEL
, wParam
, lParam
);
526 case WM_ICONERASEBKGND
:
529 HBRUSH hBrush
= (HBRUSH
)GetClassLongPtrW(hWnd
, GCL_HBRBACKGROUND
);
535 if (GetClassLongPtrW(hWnd
, GCL_STYLE
) & CS_PARENTDC
)
537 /* can't use GetClipBox with a parent DC or we fill the whole parent */
538 GetClientRect(hWnd
, &Rect
);
539 DPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
543 GetClipBox((HDC
)wParam
, &Rect
);
545 FillRect((HDC
)wParam
, &Rect
, hBrush
);
549 case WM_CTLCOLORMSGBOX
:
550 case WM_CTLCOLOREDIT
:
551 case WM_CTLCOLORLISTBOX
:
554 case WM_CTLCOLORSTATIC
:
555 case WM_CTLCOLORSCROLLBAR
:
556 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
559 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
562 return (DefWndHandleSysCommand(hWnd
, wParam
, lParam
));
571 case WM_QUERYDROPOBJECT
:
573 if (GetWindowLongPtrW(hWnd
, GWL_EXSTYLE
) & WS_EX_ACCEPTFILES
)
580 case WM_QUERYDRAGICON
:
585 hIcon
= (HICON
)GetClassLongPtrW(hWnd
, GCL_HICON
);
588 return ((LRESULT
)hIcon
);
590 for (Len
= 1; Len
< 64; Len
++)
592 if ((hIcon
= LoadIconW(NULL
, MAKEINTRESOURCEW(Len
))) != NULL
)
594 return((LRESULT
)hIcon
);
597 return ((LRESULT
)LoadIconW(0, IDI_APPLICATION
));
600 case WM_ISACTIVEICON
:
603 isai
= (pWnd
->state
& WNDS_ACTIVEFRAME
) != 0;
607 case WM_NOTIFYFORMAT
:
609 if (lParam
== NF_QUERY
)
610 return IsWindowUnicode(hWnd
) ? NFR_UNICODE
: NFR_ANSI
;
616 return DefWndGetIcon(pWnd
, wParam
, lParam
);
623 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
627 SendMessageA(GetParent(hWnd
), Msg
, wParam
, lParam
);
633 case WM_QUERYENDSESSION
:
638 case WM_INPUTLANGCHANGEREQUEST
:
642 if(wParam
& INPUTLANGCHANGE_BACKWARD
643 && wParam
& INPUTLANGCHANGE_FORWARD
)
648 //FIXME: What to do with INPUTLANGCHANGE_SYSCHARSET ?
650 if(wParam
& INPUTLANGCHANGE_BACKWARD
) NewHkl
= (HKL
) HKL_PREV
;
651 else if(wParam
& INPUTLANGCHANGE_FORWARD
) NewHkl
= (HKL
) HKL_NEXT
;
652 else NewHkl
= (HKL
) lParam
;
654 NtUserActivateKeyboardLayout(NewHkl
, 0);
659 case WM_INPUTLANGCHANGE
:
662 HWND
*win_array
= WIN_ListChildren( hWnd
);
666 while (win_array
[count
])
667 SendMessageW( win_array
[count
++], WM_INPUTLANGCHANGE
, wParam
, lParam
);
668 HeapFree(GetProcessHeap(),0,win_array
);
672 case WM_QUERYUISTATE
:
675 PWND Wnd
= ValidateHwnd(hWnd
);
679 Ret
|= UISF_HIDEFOCUS
;
681 Ret
|= UISF_HIDEACCEL
;
686 case WM_CHANGEUISTATE
:
688 BOOL AlwaysShowCues
= FALSE
;
689 WORD Action
= LOWORD(wParam
);
690 WORD Flags
= HIWORD(wParam
);
693 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
697 Wnd
= ValidateHwnd(hWnd
);
698 if (!Wnd
|| lParam
!= 0)
701 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
704 if (Flags
& UISF_ACTIVE
)
706 WARN("WM_CHANGEUISTATE does not yet support UISF_ACTIVE!\n");
709 if (Action
== UIS_INITIALIZE
)
711 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
715 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
716 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
718 /* We need to update wParam in case we need to send out messages */
719 wParam
= MAKEWPARAM(Action
, Flags
);
725 /* See if we actually need to change something */
726 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
728 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
731 /* Don't need to do anything... */
735 /* See if we actually need to change something */
736 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
738 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
741 /* Don't need to do anything... */
745 WARN("WM_CHANGEUISTATE: Unsupported Action 0x%x\n", Action
);
749 if ((Wnd
->style
& WS_CHILD
) && Wnd
->spwndParent
!= NULL
)
751 /* We're a child window and we need to pass this message down until
753 hWnd
= UserHMGetHandle((PWND
)DesktopPtrToUser(Wnd
->spwndParent
));
757 /* We're a top level window, we need to change the UI state */
758 Msg
= WM_UPDATEUISTATE
;
762 return SendMessageW(hWnd
, Msg
, wParam
, lParam
);
764 return SendMessageA(hWnd
, Msg
, wParam
, lParam
);
767 case WM_UPDATEUISTATE
:
770 BOOL AlwaysShowCues
= FALSE
;
771 WORD Action
= LOWORD(wParam
);
772 WORD Flags
= HIWORD(wParam
);
775 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
779 Wnd
= ValidateHwnd(hWnd
);
780 if (!Wnd
|| lParam
!= 0)
783 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
786 if (Flags
& UISF_ACTIVE
)
788 WARN("WM_UPDATEUISTATE does not yet support UISF_ACTIVE!\n");
791 if (Action
== UIS_INITIALIZE
)
793 PDESKTOPINFO Desk
= GetThreadDesktopInfo();
797 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
798 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
800 /* We need to update wParam for broadcasting the update */
801 wParam
= MAKEWPARAM(Action
, Flags
);
807 /* See if we actually need to change something */
808 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
810 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
813 /* Don't need to do anything... */
818 /* See if we actually need to change something */
819 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
821 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
824 /* Don't need to do anything... */
829 WARN("WM_UPDATEUISTATE: Unsupported Action 0x%x\n", Action
);
833 /* Pack the information and call win32k */
836 if (!NtUserxUpdateUiState(hWnd
, Flags
| ((DWORD
)Action
<< 3)))
840 /* Always broadcast the update to all children */
841 EnumChildWindows(hWnd
,
848 /* Move to Win32k !*/
850 if (!lParam
) break; // Call when it is necessary.
854 case WM_NCLBUTTONDOWN
:
855 case WM_LBUTTONDBLCLK
:
856 case WM_NCLBUTTONDBLCLK
:
857 case WM_NCRBUTTONDOWN
:
869 case WM_SYSCOLORCHANGE
:
870 case WM_NCUAHDRAWCAPTION
:
871 case WM_NCUAHDRAWFRAME
:
877 case WM_CLIENTSHUTDOWN
:
880 case WM_WINDOWPOSCHANGING
:
881 case WM_WINDOWPOSCHANGED
:
887 NtUserMessageCall( hWnd
, Msg
, wParam
, lParam
, (ULONG_PTR
)&lResult
, FNID_DEFWINDOWPROC
, !bUnicode
);
896 * helpers for calling IMM32 (from Wine 10/22/2008)
898 * WM_IME_* messages are generated only by IMM32,
899 * so I assume imm32 is already LoadLibrary-ed.
902 DefWndImmGetDefaultIMEWnd(HWND hwnd
)
904 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
905 HWND (WINAPI
*pFunc
)(HWND
);
910 ERR("cannot get IMM32 handle\n");
914 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmGetDefaultIMEWnd");
916 hwndRet
= (*pFunc
)(hwnd
);
923 DefWndImmIsUIMessageA(HWND hwndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
925 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
926 BOOL (WINAPI
*pFunc
)(HWND
,UINT
,WPARAM
,LPARAM
);
931 ERR("cannot get IMM32 handle\n");
935 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmIsUIMessageA");
937 fRet
= (*pFunc
)(hwndIME
, msg
, wParam
, lParam
);
944 DefWndImmIsUIMessageW(HWND hwndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
946 HINSTANCE hInstIMM
= GetModuleHandleW(L
"imm32\0");
947 BOOL (WINAPI
*pFunc
)(HWND
,UINT
,WPARAM
,LPARAM
);
952 ERR("cannot get IMM32 handle\n");
956 pFunc
= (void*) GetProcAddress(hInstIMM
, "ImmIsUIMessageW");
958 fRet
= (*pFunc
)(hwndIME
, msg
, wParam
, lParam
);
965 RealDefWindowProcA(HWND hWnd
,
973 Wnd
= ValidateHwnd(hWnd
);
976 Msg
!= WM_CTLCOLORMSGBOX
&&
977 Msg
!= WM_CTLCOLORBTN
&&
978 Msg
!= WM_CTLCOLORDLG
&&
979 Msg
!= WM_CTLCOLORSTATIC
)
982 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
988 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
992 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
993 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
994 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
1000 LPCREATESTRUCTA cs
= (LPCREATESTRUCTA
)lParam
;
1001 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1002 * may have child window IDs instead of window name */
1003 if (HIWORD(cs
->lpszName
))
1005 DefSetText(hWnd
, (PCWSTR
)cs
->lpszName
, TRUE
);
1012 case WM_GETTEXTLENGTH
:
1017 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
1019 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1021 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1023 Wnd
->strName
.Length
)))
1025 Result
= (LRESULT
) len
;
1036 PSTR outbuf
= (PSTR
)lParam
;
1039 if (Wnd
!= NULL
&& wParam
!= 0)
1041 if (Wnd
->strName
.Buffer
!= NULL
)
1042 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1048 if (Wnd
->strName
.Length
!= 0)
1050 copy
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1051 Result
= WideCharToMultiByte(CP_ACP
,
1059 outbuf
[Result
] = '\0';
1070 DefSetText(hWnd
, (PCWSTR
)lParam
, TRUE
);
1072 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1074 UserPaintCaption(Wnd
, DC_TEXT
);
1075 IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE
, hWnd
, OBJID_WINDOW
, CHILDID_SELF
, 0);
1081 case WM_IME_KEYDOWN
:
1083 Result
= PostMessageA(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
1089 Result
= PostMessageA(hWnd
, WM_KEYUP
, wParam
, lParam
);
1096 PostMessageA(hWnd
, WM_CHAR
, HIBYTE(wParam
), lParam
);
1097 PostMessageA(hWnd
, WM_CHAR
, LOBYTE(wParam
), lParam
);
1101 case WM_IME_STARTCOMPOSITION
:
1102 case WM_IME_COMPOSITION
:
1103 case WM_IME_ENDCOMPOSITION
:
1106 case WM_IME_CONTROL
:
1110 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1112 Result
= SendMessageA(hwndIME
, Msg
, wParam
, lParam
);
1116 case WM_IME_SETCONTEXT
:
1120 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1122 Result
= DefWndImmIsUIMessageA(hwndIME
, Msg
, wParam
, lParam
);
1128 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, FALSE
);
1131 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1137 RealDefWindowProcW(HWND hWnd
,
1145 Wnd
= ValidateHwnd(hWnd
);
1148 Msg
!= WM_CTLCOLORMSGBOX
&&
1149 Msg
!= WM_CTLCOLORBTN
&&
1150 Msg
!= WM_CTLCOLORDLG
&&
1151 Msg
!= WM_CTLCOLORSTATIC
)
1154 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1160 Wnd
->style
& (WS_HSCROLL
| WS_VSCROLL
) )
1164 SCROLLINFO si
= {sizeof si
, SIF_ALL
, 0, 100, 0, 0, 0};
1165 SetScrollInfo( hWnd
, SB_HORZ
, &si
, FALSE
);
1166 SetScrollInfo( hWnd
, SB_VERT
, &si
, FALSE
);
1172 LPCREATESTRUCTW cs
= (LPCREATESTRUCTW
)lParam
;
1173 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1174 * may have child window IDs instead of window name */
1175 if (HIWORD(cs
->lpszName
))
1177 DefSetText(hWnd
, cs
->lpszName
, FALSE
);
1184 case WM_GETTEXTLENGTH
:
1189 if (Wnd
!= NULL
&& Wnd
->strName
.Length
!= 0)
1191 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1193 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1195 Wnd
->strName
.Length
)))
1197 Result
= (LRESULT
) (Wnd
->strName
.Length
/ sizeof(WCHAR
));
1208 PWSTR outbuf
= (PWSTR
)lParam
;
1210 if (Wnd
!= NULL
&& wParam
!= 0)
1212 if (Wnd
->strName
.Buffer
!= NULL
)
1213 buf
= DesktopPtrToUser(Wnd
->strName
.Buffer
);
1219 if (Wnd
->strName
.Length
!= 0)
1221 Result
= min(Wnd
->strName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1222 RtlCopyMemory(outbuf
,
1224 Result
* sizeof(WCHAR
));
1225 outbuf
[Result
] = L
'\0';
1236 DefSetText(hWnd
, (PCWSTR
)lParam
, FALSE
);
1238 if ((GetWindowLongPtrW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1239 UserPaintCaption(Wnd
, DC_TEXT
);
1246 PostMessageW(hWnd
, WM_CHAR
, wParam
, lParam
);
1251 case WM_IME_KEYDOWN
:
1253 Result
= PostMessageW(hWnd
, WM_KEYDOWN
, wParam
, lParam
);
1259 Result
= PostMessageW(hWnd
, WM_KEYUP
, wParam
, lParam
);
1263 case WM_IME_STARTCOMPOSITION
:
1264 case WM_IME_COMPOSITION
:
1265 case WM_IME_ENDCOMPOSITION
:
1268 case WM_IME_CONTROL
:
1272 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1274 Result
= SendMessageW(hwndIME
, Msg
, wParam
, lParam
);
1278 case WM_IME_SETCONTEXT
:
1282 hwndIME
= DefWndImmGetDefaultIMEWnd(hWnd
);
1284 Result
= DefWndImmIsUIMessageW(hwndIME
, Msg
, wParam
, lParam
);
1289 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, TRUE
);
1291 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1297 DefWindowProcA(HWND hWnd
,
1302 BOOL Hook
, msgOverride
= FALSE
;
1307 Hook
= BeginIfHookedUserApiHook();
1310 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1311 if(msgOverride
== FALSE
)
1317 /* Bypass SEH and go direct. */
1318 if (!Hook
|| !msgOverride
)
1319 return RealDefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1323 Result
= guah
.DefWindowProcA(hWnd
, Msg
, wParam
, lParam
);
1325 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1336 DefWindowProcW(HWND hWnd
,
1341 BOOL Hook
, msgOverride
= FALSE
;
1346 Hook
= BeginIfHookedUserApiHook();
1349 msgOverride
= IsMsgOverride(Msg
, &guah
.DefWndProcArray
);
1350 if(msgOverride
== FALSE
)
1356 /* Bypass SEH and go direct. */
1357 if (!Hook
|| !msgOverride
)
1358 return RealDefWindowProcW(hWnd
, Msg
, wParam
, lParam
);
1362 Result
= guah
.DefWindowProcW(hWnd
, Msg
, wParam
, lParam
);
1364 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)