The best way it's to use cross-process handler, like a mutex.
Here is a good example.
One more thing, if you want to open hidden application from another instance, you should make client-server communication between two applications. Application that is already running should be server and should listen for command to become visible. Thats rather simple but it takes a lot of time for understanding.
UPDATED:
Here I've committed a simple library that allows you control application instances. It's very simple but i leave some comments
ApplicationSingleInstance - it's the main class for controlling application instances
When application starts check property IsInstanceAlreadyRun, if it's true invoke StartServer() method, if false invoke NotifyAboutNewInstance() method. Also you should subscribe on NewApplicationInstanceLoaded event to know if new application instance has been started. Do not forget to unsubscribe from events and dispose instance of ApplicationSingleInstance
UPDATED:
I've posted this lib and explanation on codeproject