PureBasic Forum
http://forums.purebasic.com/english/

IsHwndVisible() for Win 10 compatibilty
http://forums.purebasic.com/english/viewtopic.php?f=12&t=72941
Page 1 of 1

Author:  BarryG [ Mon Jun 03, 2019 3:38 am ]
Post subject:  IsHwndVisible() for Win 10 compatibilty

Just discovered today that invisible Windows 10 UWP windows (like Calculator, Microsoft Store, Settings, Xbox, and such) can return non-zero with IsWindowVisible_(), which is obviously NOT the desired result. I did some research and came up with this procedure that will correctly return 0 if any window is invisible, 1 if it's visible, or -1 if not found or unable to be determined.

I purposely named it IsHwndVisible() so as not to clash with IsWindowVisible_() when searching/replacing your sources.

Code:
Prototype DwmGetWindowAttribute_(hWnd,dwAttribute.l,*pvAttribute,cbAttribute.l)
Procedure IsHwndVisible(hWnd)
  vis=-1 ; Means hWnd not found or couldn't determine visibility status.
  c$=Space(999)
  GetClassName_(hWnd,c$,999)
  If c$<>"ApplicationFrameWindow" And c$<>"Windows.UI.Core.CoreWindow" ; Normal Win32 window.
    vis=IsWindowVisible_(hWnd)
    If vis<>0 : vis=1 : EndIf
  Else ; Windows 10 UWP window, which can return non-zero for IsWindowVisible_() despite not shown!
    Define DwmGetWindowAttribute_.DwmGetWindowAttribute_
    #DWMWA_CLOAKED=14
    DWMAPIDLL=OpenLibrary(#PB_Any,"DWMAPI.DLL")
    If DWMAPIDLL
      DwmGetWindowAttribute_=GetFunction(DWMAPIDLL,"DwmGetWindowAttribute")
      If DwmGetWindowAttribute_ And DwmGetWindowAttribute_(hWnd,#DWMWA_CLOAKED,@Cloaked,SizeOf(Cloaked))=#S_OK
        If Cloaked=0
          vis=1
        Else
          vis=0
        EndIf
      EndIf
      CloseLibrary(DWMAPIDLL)
    EndIf
  EndIf
  ProcedureReturn vis
EndProcedure

Debug IsHwndVisible(FindWindow_(0,"Untitled - Notepad")) ; Standard Win32 window.
Debug IsHwndVisible(FindWindow_(0,"Microsoft Store"))    ; Windows 10 UWP window.

Author:  RSBasic [ Mon Jun 03, 2019 6:59 am ]
Post subject:  Re: IsHwndVisible() for Win 10 compatibilty

Image

Author:  BarryG [ Mon Jun 03, 2019 7:05 am ]
Post subject:  Re: IsHwndVisible() for Win 10 compatibilty

Thanks RSBasic. :)

Here's one of the pages I found that led me to the solution:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/0d7419a7-1d25-40bc-909e-a0db33b109a8/iswindowvisible-fails-to-detect-if-store-app-is-visible

It's pretty shocking that IsWindowVisible_() can't be relied on anymore. Really bad move, Microsoft - this will break a LOT of window-management tools.

Author:  BarryG [ Thu Aug 22, 2019 11:27 am ]
Post subject:  Re: IsHwndVisible() for Win 10 compatibilty

BTW, does the Prototype command have to go inside the procedure in my code? Or is it okay to stay outside? Are prototypes global?

Author:  Little John [ Thu Aug 22, 2019 4:09 pm ]
Post subject:  Re: IsHwndVisible() for Win 10 compatibilty

Prototypes have a global scope, like e.g. structures:

Code:
EnableExplicit

Procedure.d CalcAdd (value1.d, value2.d)
   ProcedureReturn value1 + value2
EndProcedure

Procedure.d CalcMul (value1.d, value2.d)
   ProcedureReturn value1 * value2
EndProcedure

Prototype.d ProtoCalc (value1.d, value2.d)


Procedure Main (value1.d, value2.d)
   Protected Calc.ProtoCalc
   
   Calc = @ CalcAdd()
   Debug Calc(value1, value2)
   
   Calc = @ CalcMul()
   Debug Calc(value1, value2)
EndProcedure


Main(2.5, 3.0)

Author:  BarryG [ Thu Aug 22, 2019 10:10 pm ]
Post subject:  Re: IsHwndVisible() for Win 10 compatibilty

Thanks, LJ!

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/