IsIconic_() fails for UWP windows

Windows specific forum
BarryG
Addict
Addict
Posts: 3322
Joined: Thu Apr 18, 2019 8:17 am

IsIconic_() fails for UWP windows

Post by BarryG »

[Edit] My mistake. See my other post further below.

Original post:

This is strange. Press Win+I to open Win 10's "Settings" app, then run this code. It'll show 0. Then minimize the "Settings" window, and run this again. It still shows 0, as if the window isn't minimized. So how do we tell when a UWP window is actually minimized?

Note: The opposite API call of IsZoomed_() works perfectly to detect maximized UWP windows.

Code: Select all

hWnd=FindWindow_(0,"Settings")
Debug IsIconic_(hWnd)
Last edited by BarryG on Sat Dec 14, 2019 1:28 am, edited 1 time in total.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4663
Joined: Sun Apr 12, 2009 6:27 am

Re: IsIconic_() fails for UWP windows

Post by RASHAD »

Hi BarryG
Adapt it for your needs

Code: Select all

Prototype DwmGetWindowAttribute(hWnd,dwAttribute.l,*pvAttribute,cbAttribute.l)
Global DwmGWA.DwmGetWindowAttribute,hWnd,title${#MAX_PATH},class${#MAX_PATH}
#DWMWA_CLOAKED = 14

Procedure GetWinState()
  hWnd = FindWindow_(0, 0)
  Repeat
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
    If hWnd And IsWindowVisible_(hWnd) And GetWindowLongPtr_(hWnd, #GWL_HWNDPARENT) = 0
      GetWindowText_(hWnd, @title$, #MAX_PATH)
      GetClassName_(hWnd,@class$,#MAX_PATH)
       If class$ = "ApplicationFrameWindow" Or class$ = "Windows.UI.Core.CoreWindow"
        dll = OpenLibrary(#PB_Any,"DWMAPI.DLL")
        If dll
          DwmGWA = GetFunction(dll,"DwmGetWindowAttribute")
          If DwmGWA
            DwmGWA(hWnd,#DWMWA_CLOAKED,@Cloaked,SizeOf(Cloaked))
            If Cloaked = 0 And title$ = "Settings"
              If IsIconic_(hwnd)
                Debug "Minimized"
              ElseIf IsZoomed_(hwnd)
                Debug "Maximized"
              Else
                Debug "Normal"
              EndIf 
            EndIf
          EndIf
          CloseLibrary(dll)
        EndIf
      EndIf
    EndIf
  Until hWnd = 0
  ProcedureReturn #False
EndProcedure

GetWinState()
Egypt my love
BarryG
Addict
Addict
Posts: 3322
Joined: Thu Apr 18, 2019 8:17 am

Re: IsIconic_() fails for UWP windows

Post by BarryG »

Thanks for your quick reply, Rashad. But I'm sorry to report it was a mistake on my part. Turns out there must be another (and invisible!) window on my PC called "Settings" that FindWindow_() has found, because when I check IsIconic_() with the following code, it works. Sorry to have wasted your time, but your code is still useful for me in other ways.

Code: Select all

Macro WaitForCtrlPress()
  Repeat : Sleep_(1) : Until GetAsyncKeyState_(#VK_CONTROL) & $8000 ; Is down.
  Repeat : Sleep_(1) : Until GetAsyncKeyState_(#VK_CONTROL)=0 ; Now wait for up.
EndMacro

Debug "Open Settings with Win+I, click it, then hit Ctrl"

WaitForCtrlPress()
hWnd=GetForegroundWindow_()
cap$=Space(100) : GetWindowText_(hWnd,cap$,100)
Debug "Got hWnd of: "+cap$
Debug "Now minimize it and hit Ctrl again"

WaitForCtrlPress()
Debug "IsIconic: "+Str(IsIconic_(hWnd))
Post Reply