@@ -66,7 +66,9 @@ extern "system" fn object_destroyed_cb(
6666 } ;
6767
6868 if has_been_closed {
69- unsafe { UnhookWinEvent ( this) } ;
69+ unsafe {
70+ let _ = UnhookWinEvent ( this) ;
71+ }
7072 }
7173 }
7274}
@@ -152,50 +154,73 @@ impl Window {
152154 unsafe { IsWindowVisible ( self . handle ) . as_bool ( ) }
153155 }
154156
155- pub fn is_capturable ( & self ) -> bool {
156- unsafe {
157- if self . title . is_empty ( )
158- || !self . is_visible ( )
159- || self . handle == GetShellWindow ( )
160- || self . handle == GetConsoleWindow ( )
161- || GetAncestor ( self . handle , GA_ROOT ) != self . handle
162- {
163- return false ;
164- }
165- }
157+ pub fn is_shell_window ( & self ) -> bool {
158+ self . handle == unsafe { GetShellWindow ( ) }
159+ }
166160
167- let style = unsafe { GetWindowLongW ( self . handle , GWL_STYLE ) } ;
168- if style & ( WS_DISABLED . 0 as i32 ) == 1 {
169- return false ;
170- }
161+ pub fn is_console_window ( & self ) -> bool {
162+ self . handle == unsafe { GetConsoleWindow ( ) }
163+ }
171164
172- // No tooltips
173- let ex_style = unsafe { GetWindowLongW ( self . handle , GWL_EXSTYLE ) } ;
174- if ex_style & ( WS_EX_TOOLWINDOW . 0 as i32 ) == 1 {
175- return false ;
176- }
165+ pub fn get_root ( & self ) -> HWND {
166+ unsafe { GetAncestor ( self . handle , GA_ROOT ) }
167+ }
177168
178- // Unfortunate work-around. Not sure how to avoid this.
179- if self . is_known_blocked_window ( ) {
169+ pub fn is_top_level ( & self ) -> bool {
170+ self . get_root ( ) == self . handle
171+ }
172+
173+ /// https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles
174+ pub fn get_style ( & self ) -> i32 {
175+ unsafe { GetWindowLongW ( self . handle , GWL_STYLE ) }
176+ }
177+
178+ /// https://learn.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles
179+ pub fn get_ex_style ( & self ) -> i32 {
180+ unsafe { GetWindowLongW ( self . handle , GWL_EXSTYLE ) }
181+ }
182+
183+ pub fn is_disabled ( & self ) -> bool {
184+ self . get_style ( ) & ( WS_DISABLED . 0 as i32 ) == 1
185+ }
186+
187+ pub fn is_tooltip ( & self ) -> bool {
188+ self . get_ex_style ( ) & ( WS_EX_TOOLWINDOW . 0 as i32 ) == 1
189+ }
190+
191+ pub fn is_uwp_window ( & self ) -> bool {
192+ self . class_name == "Windows.UI.Core.CoreWindow"
193+ || self . class_name == "ApplicationFrameWindow"
194+ }
195+
196+ pub fn is_dwm_cloaked ( & self ) -> bool {
197+ let mut cloaked: u32 = 0 ;
198+ let dwm_attr_cloaked = unsafe {
199+ DwmGetWindowAttribute (
200+ self . handle ,
201+ DWMWA_CLOAKED ,
202+ & mut cloaked as * mut _ as * mut _ ,
203+ std:: mem:: size_of :: < u32 > ( ) as u32 ,
204+ )
205+ } ;
206+ dwm_attr_cloaked. is_ok ( ) && cloaked == DWM_CLOAKED_SHELL
207+ }
208+
209+ pub fn is_capturable ( & self ) -> bool {
210+ if !self . is_visible ( )
211+ || self . is_shell_window ( )
212+ || self . is_console_window ( )
213+ || !self . is_top_level ( )
214+ || self . is_disabled ( )
215+ || self . is_tooltip ( )
216+ || self . is_known_blocked_window ( )
217+ {
180218 return false ;
181219 }
182220
183221 // Check to see if the self is cloaked if it's a UWP
184- if self . class_name == "Windows.UI.Core.CoreWindow"
185- || self . class_name == "ApplicationFrameWindow"
186- {
187- let mut cloaked: u32 = 0 ;
188- let dwm_attr_cloaked = unsafe {
189- DwmGetWindowAttribute (
190- self . handle ,
191- DWMWA_CLOAKED ,
192- & mut cloaked as * mut _ as * mut _ ,
193- std:: mem:: size_of :: < u32 > ( ) as u32 ,
194- )
195- } ;
196- if dwm_attr_cloaked. is_ok ( ) && cloaked == DWM_CLOAKED_SHELL {
197- return false ;
198- }
222+ if self . is_uwp_window ( ) && self . is_dwm_cloaked ( ) {
223+ return false ;
199224 }
200225
201226 true
@@ -206,6 +231,24 @@ impl Window {
206231 unsafe { GetWindowThreadProcessId ( self . handle , Some ( & mut process_id) ) } ;
207232 process_id
208233 }
234+
235+ pub fn print_info ( & self ) {
236+ println ! ( "title = {}" , self . title) ;
237+ println ! ( "class = {}" , self . class_name) ;
238+ println ! ( "is_capturable = {}" , self . is_capturable( ) ) ;
239+ println ! ( "\t is_visible = {}" , self . is_visible( ) ) ;
240+ println ! ( "\t is_shell_window = {}" , self . is_shell_window( ) ) ;
241+ println ! ( "\t is_console_window = {}" , self . is_console_window( ) ) ;
242+ println ! ( "\t is_top_level = {}" , self . is_top_level( ) ) ;
243+ println ! ( "\t is_disabled = {}" , self . is_disabled( ) ) ;
244+ println ! ( "\t is_tooltip = {}" , self . is_tooltip( ) ) ;
245+ println ! ( "\t is_uwp_window = {}" , self . is_uwp_window( ) ) ;
246+ println ! ( "\t is_dwm_cloaked = {}" , self . is_dwm_cloaked( ) ) ;
247+ println ! (
248+ "\t is_known_blocked_window = {}" ,
249+ self . is_known_blocked_window( )
250+ ) ;
251+ }
209252}
210253
211254impl Capturable for Window {
@@ -220,7 +263,7 @@ impl Capturable for Window {
220263 let mut top_left = POINT :: default ( ) ;
221264 unsafe {
222265 GetWindowRect ( self . handle , & mut window_rect) ?;
223- ClientToScreen ( self . handle , & mut top_left) ;
266+ let _ = ClientToScreen ( self . handle , & mut top_left) ;
224267 GetClientRect ( self . handle , & mut client_rect) ?;
225268 }
226269
0 commit comments