Your application can create global synchronization object like Semaphore or Event with predefined name. Other applications can check if this object exists.
When the application exits or crashes the synchronization object is removed automatically.
See API functions CloseHandle, CreateSemaphore, GetLastError, OpenSemaphore.