You may try using MUTEX objects...

Mutex Objects - Win32 apps | Microsoft Docs

for each different webapp project, you create a named mutex,

The 1st process starting by the pool will be able to create such mutex, and own it..
all the others will fail. so you get your 1st app

Same also may help you when the Pool is being recycled..
When the 1st process is terminated by Webapp Admin, you can release the mutex normally, but even if your process crashes.. the mutex is considered ABANDONED, and the next process that tries to own it , will succeed.

I used mutex objects is the past, to avoid regular windows DF Apps to be started more than one. If the user have already started one instance of the applications, he/she was not allowed to start a second one.. the mutex creation failed, and I terminated the app upon start-up time

So I remember this could also be used for your need..