@@ -13,15 +13,16 @@ use windows_sys::Win32::{
1313 } ,
1414 WindowsAndMessaging :: {
1515 AdjustWindowRectEx , CreateWindowExW , DefWindowProcW , DestroyWindow , DispatchMessageW ,
16- GetMessageW , GetWindowLongPtrW , LoadCursorW , PostMessageW , SetCursor , SetTimer ,
17- SetWindowLongPtrW , SetWindowPos , TranslateMessage , GWLP_USERDATA , HTCLIENT , MSG ,
18- SWP_NOACTIVATE , SWP_NOMOVE , SWP_NOZORDER , WHEEL_DELTA , WM_CHAR , WM_CLOSE , WM_CREATE ,
19- WM_DPICHANGED , WM_INPUTLANGCHANGE , WM_KEYDOWN , WM_KEYUP , WM_KILLFOCUS , WM_LBUTTONDOWN ,
20- WM_LBUTTONUP , WM_MBUTTONDOWN , WM_MBUTTONUP , WM_MOUSEHWHEEL , WM_MOUSEMOVE ,
21- WM_MOUSEWHEEL , WM_NCDESTROY , WM_RBUTTONDOWN , WM_RBUTTONUP , WM_SETCURSOR , WM_SETFOCUS ,
22- WM_SHOWWINDOW , WM_SIZE , WM_SYSCHAR , WM_SYSKEYDOWN , WM_SYSKEYUP , WM_TIMER , WM_USER ,
23- WM_XBUTTONDOWN , WM_XBUTTONUP , WS_CAPTION , WS_CHILD , WS_CLIPSIBLINGS , WS_MAXIMIZEBOX ,
24- WS_MINIMIZEBOX , WS_POPUPWINDOW , WS_SIZEBOX , WS_VISIBLE ,
16+ GetMessageW , GetParent , GetWindowLongPtrW , LoadCursorW , PostMessageW , SendMessageW ,
17+ SetCursor , SetTimer , SetWindowLongPtrW , SetWindowPos , TranslateMessage , GWLP_USERDATA ,
18+ HTCLIENT , MSG , SWP_NOACTIVATE , SWP_NOMOVE , SWP_NOZORDER , WHEEL_DELTA , WM_CHAR ,
19+ WM_CLOSE , WM_CREATE , WM_DPICHANGED , WM_INPUTLANGCHANGE , WM_KEYDOWN , WM_KEYUP ,
20+ WM_KILLFOCUS , WM_LBUTTONDOWN , WM_LBUTTONUP , WM_MBUTTONDOWN , WM_MBUTTONUP ,
21+ WM_MOUSEHWHEEL , WM_MOUSEMOVE , WM_MOUSEWHEEL , WM_NCDESTROY , WM_RBUTTONDOWN ,
22+ WM_RBUTTONUP , WM_SETCURSOR , WM_SETFOCUS , WM_SHOWWINDOW , WM_SIZE , WM_SYSCHAR ,
23+ WM_SYSKEYDOWN , WM_SYSKEYUP , WM_TIMER , WM_USER , WM_XBUTTONDOWN , WM_XBUTTONUP ,
24+ WS_CAPTION , WS_CHILD , WS_CLIPSIBLINGS , WS_MAXIMIZEBOX , WS_MINIMIZEBOX , WS_POPUPWINDOW ,
25+ WS_SIZEBOX , WS_VISIBLE ,
2526 } ,
2627 } ,
2728} ;
@@ -45,8 +46,8 @@ const BV_WINDOW_MUST_CLOSE: u32 = WM_USER + 1;
4546
4647use crate :: win:: hook:: { self , KeyboardHookHandle } ;
4748use crate :: {
48- Event , MouseButton , MouseCursor , MouseEvent , PhyPoint , PhySize , ScrollDelta , Size , WindowEvent ,
49- WindowHandler , WindowInfo , WindowOpenOptions , WindowScalePolicy ,
49+ Event , EventStatus , MouseButton , MouseCursor , MouseEvent , PhyPoint , PhySize , ScrollDelta , Size ,
50+ WindowEvent , WindowHandler , WindowInfo , WindowOpenOptions , WindowScalePolicy ,
5051} ;
5152
5253use super :: cursor:: cursor_to_lpcwstr;
@@ -352,13 +353,24 @@ unsafe fn wnd_proc_inner(
352353 let opt_event =
353354 window_state. keyboard_state . borrow_mut ( ) . process_message ( hwnd, msg, wparam, lparam) ;
354355
355- if let Some ( event) = opt_event {
356+ let status = if let Some ( event) = opt_event {
356357 window_state
357358 . handler
358359 . borrow_mut ( )
359360 . as_mut ( )
360361 . unwrap ( )
361- . on_event ( & mut window, Event :: Keyboard ( event) ) ;
362+ . on_event ( & mut window, Event :: Keyboard ( event) )
363+ } else {
364+ EventStatus :: Ignored
365+ } ;
366+
367+ if status == EventStatus :: Ignored {
368+ let parent = GetParent ( hwnd) ;
369+ if !parent. is_null ( ) {
370+ SendMessageW ( parent, msg, wparam, lparam) ;
371+ return Some ( 0 ) ;
372+ }
373+ return None ;
362374 }
363375
364376 if msg != WM_SYSKEYDOWN {
0 commit comments