Nachricht senden an ein Windows-Prozess (nicht das Hauptfenster)
Ich habe eine Anwendung, die auf einen weiteren start erkennt, ob ein Prozess mit demselben Namen bereits läuft und wenn ja, aktiviert das ausgeführte Programm-Fenster und dann beendet.
Das problem ist, dass das main-Fenster kann ausgeblendet werden (nur ein Infobereich-Symbol sichtbar), damit mir kein Fenster-handle.
Start der vorherigen Instanz MainWindowHandle
Eigenschaft 0 ist, so kann ich nicht senden ShowWindow
oder PostMessage
.
Gibt es eine Möglichkeit, ich kann senden Sie eine Nachricht abgefangen werden können, die durch das ausgeführte Programm, so dass es für die Anzeige des Hauptfensters?
Die Anwendung ist in C# geschrieben, der code, den ich verwende um dies zu erreichen unten.
[STAThread]
static void Main()
{
bool createdNew = true;
using (Mutex mutex = new Mutex(true, "MyMutexName", out createdNew))
{
if (createdNew)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
else
{
Process current = Process.GetCurrentProcess();
foreach (Process process in Process.GetProcessesByName(current.ProcessName))
{
if (process.Id != current.Id)
{
Interop.WINDOWINFO pwi = new Interop.WINDOWINFO();
IntPtr handle = process.MainWindowHandle;
var isVisible = Interop.GetWindowInfo(handle, ref pwi);
if (!isVisible)
{
MessageBox.Show(Constants.APP_NAME + " is already running, check the notification area (near the clock).",
Constants.APP_NAME, MessageBoxButtons.OK, MessageBoxIcon.Information);//temporary message, until I find the solution
//Interop.ShowWindow(handle, Interop.WindowShowStyle.ShowNormal);
//Interop.PostMessage(handle, Interop.WM_CUSTOM_ACTIVATEAPP, IntPtr.Zero, IntPtr.Zero);
}
else
Interop.SetForegroundWindow(handle);//this works when the window is visible
break;
}
}
}
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier, wie ich dies getan haben:
Ich hoffe, ich habe Sie transkribiert das richtig. Ich hatte zu verlassen, eine Menge anderer Sachen, aber ich glaube, ich habe was notwendig ist. Was ich habe, funktioniert bei mir ohne fehl. Wenn Sie ein problem haben, lassen Sie mich wissen, und ich werde sehen, was ich verpasst habe.
Für andere Menschen zu wollen, um dies zu erreichen, ich bin Entsendung unter meinem Implementierung, mit Matt Davis' Lösung.
Im Programm.cs
In Der MainForm.cs
Named Pipes können HIERFÜR verwendet werden. Es könnte sein, mehr akzeptable Methode mit .net.Sie können einen service definieren in der main-Anwendung, die akzeptiert eine Nachricht von der aufrufenden Anwendung. Hier ist ein Beispiel des Dienstes in vb. Es ruft die main-app und übergibt einen string, in diesem Fall mit dem Namen. Es gibt ebenfalls eine Zeichenkette zurück, aber alle Parameter, die hier verwendet werden können.
Dem setup in das aufrufende Programm ist ein wenig komplizierter. Der Aufruf und Hauptfenster der Anwendung können Sie die gleiche Anwendung.