I think Yal has the best solution, using outside "flags". So the algorythm is:
1) Crazy kids click 50 times on the icon
2) The first exe checks if a save file in %localappdata% exists (it doesn't... yet)
3) The first exe then creates the save file
4) The second, third (and so on) instances check if the save file exists (it does, now)
5) All the instances for which the check was positive end the game
6) The first instance waits for any player interaction (mouse click or something) to know that the window is active - then it destroys the file
I also think this would be best. The problem would be in the case of the game crashing before any player interaction. In that case, you should go to %localappdata% and destroy the file manually...
The same thing could also be done by setting environment variables but for that you need dll support bla bla bla.
I am not sure if that can easily be done, but I will just dump an idea here, to tweak things a bit, so we might overcome this problem stated above.
0) We create a permanent file named stamp.
1) Crazy kids click 50 times on the icon
2) The first exe checks if the stamp file contains anything. If not It creates a timestamp in it and goes on. If yes, it checks if the existing timestamp is aged 30 seconds from now. If not, it will terminate itself, else it will go on and delete the timestamp (all contents) and add a new timestamp in stamp file containing current time.
4) The second, third (and so on) instances, check if the contents of stamp file too.
On crash, worry not, timestamps expire.
You can have ONE permanent checkfile.
If it has contents, the contents is a timestamp.
Thus you can do a lot of things easier this way, updating the timestamp value.
Problem with manual file destruction disappears.
There will be a problem though in intentional many instance loadings.
Scenario:
Crazy kid loads a game once.
Then double click the game after 10 minutes.
But that's a different story. We talked about accidental double clicks.
Also there will be a problem if a game crashes, then you try to relaunch it within 30 seconds.
All right. That's logical, but it is solved in about half a minute so...
P.S. It doesn't have to be 30 seconds. You can make a timestamp expire after 2 or 5 minutes or whatever.