Hi @Takuma Yamada ,
Based on a local reproduction, a TEST92 warning is not evidence that the PerMonitorV2 declaration is missing when the same report also says WACK could not process the executable. TEST88 also flags static references, so a FAIL there does not by itself show that a launch path ran.
To check this, I built small test apps from source, packaged them as full-trust x64 MSIX packages, installed them, and ran only TEST88 and TEST92 on Windows 11 build 26300.9457 with WACK 10.0.26100.8249. These are not your binaries, and the OS and WACK versions differ from yours, so please treat this as an independent reproduction rather than a diagnosis of your report.
| Test package | Runtime observation | TEST88 | TEST92 |
|---|---|---|---|
PerMonitorV2 embedded in the manifest |
PerMonitorV2 context | PASS | WARNING, binary could not be processed |
| No DPI declaration | Unaware | PASS | Same WARNING and same message |
Native exe importing WinExec in a function that is never called |
ETW shows no child process | FAIL | WARNING |
Native exe containing only cmd and powershell.exe strings |
No child process | PASS | WARNING |
| PyInstaller + PySide6 app, one-folder and one-file | Workers relaunch the same packaged exe (same path, hash and package identity) | FAIL | WARNING |
I also saw the pattern you described. From a process without package identity, CreateActCtxW on the installed exe under WindowsApps failed with error 5, while reading the file and its RT_MANIFEST resource succeeded. The same call succeeded from two different full-trust package processes and on a byte-identical copy. I did not trace WACK's own native calls, so this does not prove that WACK hit the same error. It only shows that manifest activation on an installed exe can fail even when the file can be read.
On the first question, the retained XML and HTML can separate the two cases only if they still contain the processing message. In my runs, both files kept the "could not process" line next to the final DPI warning, and the detailed WACK trace recorded E_FAIL (0x80004005) for that check. Because the PerMonitorV2 package and the package with no DPI declaration ended with the identical warning, the final classification alone cannot tell them apart.
If your retained logs only have the final line, the stronger evidence is the manifest extracted from the exact installed exe, for example with mt.exe -inputresource:"<installed path>\YourApp.exe";#1 -out:installed.manifest, plus its hash compared with the package payload. The extracted dpiAwareness element can then be checked against Application manifests, which notes that dpiAwareness overrides dpiAware and that PerMonitorV2 is recognized starting with Windows 10 version 1703. For the runtime side, PROCESS_DPI_AWARENESS only defines values 0, 1 and 2, so GetProcessDpiAwareness returns 2 for both PerMonitor and PerMonitorV2. To tell them apart, GetThreadDpiAwarenessContext can be compared with DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 through AreDpiAwarenessContextsEqual, since that page notes contexts cannot be compared bitwise.
As for TEST88, Windows Desktop Bridge app tests lists Blocked executables as an optional, informational check aimed at Windows S mode. It says flagged files that are part of your app can be ignored, while calls that launch executables outside the app should be removed. Since a never-called import still failed in my test, I would record each finding with its evidence level: the binary and hash, the API or string, whether a runtime trace observed a child process, and if so, the resolved image path and whether it sits inside the package. The multiprocessing self-spawn fits the "part of your application" case once the trace shows the child resolves to the same packaged exe. Qt and OpenGL references with no observed child are best recorded as static or conditional references, without claiming they executed and without claiming they can never execute, because one run does not cover every code path. The one-file build also extracts DLLs at runtime, which matches the self-extracting pattern described under Archive files usage on the same page, so the one-folder build may be the safer choice if S mode matters.
What I have shared here, the reproduction results and how to read the findings against the documentation, is the extent of what I can support on this forum. For a deeper investigation of your own package or of WACK's internal behavior, Windows Developer Support is the more suitable channel, since engineers there can work directly with your binaries and logs.
I hope that the test results and documentation I’ve shared can be of some help and provide a little more clarity around the behavior you’re investigating. If you found my response helpful or informative, I would greatly appreciate it if you could follow this guidance so that others in the community facing a similar issue can find it more easily and help each other.
Thank you.