You owe me a beer for this
#include <Constants.au3>
#include <Process.au3>
#include <WinAPISysWin.au3>
#include <WinAPIProc.au3>
#include <Array.au3>
Opt("MustDeclareVars", 1)
Local $aPrograms[0][4]
Local $aWinList = WinList()
Local $iPID, $sName
For $i = 1 To $aWinList[0][0]
If $aWinList[$i][0] <> "" And BitAND(WinGetState($aWinList[$i][1]), 2) Then
$iPID = WinGetProcess($aWinList[$i][1])
$sName = _ProcessGetName($iPID)
If $sName = "ApplicationFrameHost.exe" Then
$iPID = FindTrueApp($aWinList[$i][0], $iPID, $sName)
If Not $iPID Then ContinueLoop
EndIf
_ArrayAdd($aPrograms, $aWinList[$i][0] & "|" & $aWinList[$i][1] & "|" & $iPID & "|" & $sName)
EndIf
Next
_ArrayDisplay($aPrograms)
Func FindTrueApp($sTitle, $iPID, ByRef $sProcess)
Local Static $aList = _WinAPI_EnumWindows(True)
Local $iTruePID
For $i = 1 To $aList[0][0]
If WinGetTitle($aList[$i][0]) = $sTitle Then
$iTruePID = WinGetProcess($aList[$i][0])
If $iPID <> $iTruePID Then
$sProcess = _WinAPI_GetProcessName($iTruePID)
Return $iTruePID
EndIf
EndIf
Next
Return 0
EndFunc ;==>FindTrueApp
Working nicely for me...