Du kannst nicht verhindern dass eine neue Instanz gestartet wird.
Du kannst aber erkennen, dass bereits eine Instanz läuft, dann die Parameter an die bereits laufende Instanz übergeben, und die neue Instanz danach gleich wieder beenden.
Zum Erkennen ob bereits eine Instanz läuft gibt es viele Wege. Wenn sonst nichts gemacht werden muss, ist wohl der üblichste, eine "named mutex" anzulegen (-> CreateMutex), und dann mit WaitForSingleObject zu checken ob man sie in Null-Zeit locken kann. Wenn ja ist man die erste Instanz, und lässt die Mutex gelockt. Wenn nein läuft schon eine andere Instanz.
So weit, so schlecht, denn das reicht ja für dich nicht.
Du musst irgendwie noch die Parameter an die andere Instanz übergeben.
Dazu könntest du z.B. einen Named-Pipe-Server oder einen Mailslot verwenden.
Dabei bekommst du die Info ob bereits eine Instanz läuft quasi "gratis" - wenn du die Named-Pipe bzw. den Mailslot nicht anlegen kannst, dann läuft schon eine Instanz.
Die neuen Parameter musst du dabei irgendwie serialisieren, d.h. in eine "Byte-Wurst" (BLOB, Byte-Stream - wie auch immer man es nennen will) verwandeln. Sollte bei einem Haufen Window-Handles kein Problem sein.
Diese Byte-Wurst kannst du dann über die Named-Pipe bzw. den Mailslot an die laufende Instanz schicken. Diese muss die Daten da rauslesen, und die neuen Parameter übernehmen.
Im Prinzip alles recht einfach, der schwierigste Teil dürfte sein im Server mitzubekommen dass neue Daten eingetroffen sind. Dazu brauchst du einen Thread, oder du musst asynchrone IO Funktionen verwenden. Wenn man noch nie damit gearbeitet hat kann das äusserst lästig sein.
Theoretisch könntest du auch gleich über UDP kommunizieren. An Stelle der Named-Pipe tritt dann ein auf einen bestimmten Port gebundener UDP Socket. Das Binden auf einen Port ist ja ebenfalls nur möglich, wenn nicht schon ein anderen Socket auf diesen Port gebunden ist (z.B. ein Socket eines anderen Prozesses, z.B. der bereits laufenden Instanz). Ich würde allerdings etwas vorziehen was einen etwas aussagekräftigeren Namen hat, wie z.B. eben Named-Pipes oder Mailslots.
(EDIT: Wobei... kann es sein dass ich mich da jetzt täusche? Können vielleicht doch mehrere Prozesse nen Socket auf den selben UDP Port binden? Gibt ja nicht wirklich nen absoluten KO Grund warum das nicht gehen sollte... ausgenommen mal Security-Geschichten /EDIT)
EDIT2: rofl. bin doof. entfernt. /EDIT