Comment puis-je focaliser une fenêtre étrangère?
J'ai une application qui ne peut avoir qu'une seule instance de lui-même ouvert à la fois. Pour appliquer cela, j'utilise ce code:
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();
System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess();
foreach (System.Diagnostics.Process p in myProcesses)
{
if (p.ProcessName == me.ProcessName)
if (p.Id != me.Id)
{
//if already running, abort this copy.
return;
}
}
//launch the application.
//...
Il fonctionne très bien. J'aimerais aussi qu'il soit capable de se concentrer à la forme de la déjà en cours d'exécution exemplaire. C'est, avant de revenir, je veux amener de l'autre instance de l'application au premier plan.
Comment dois-je faire?
Re: SetForeGroundWindow:
SetForeGroundWindow œuvres, à un point:
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
//...
if (p.Id != me.Id)
{
//if already running, focus it, and then abort this copy.
SetForegroundWindow(p.MainWindowHandle);
return;
}
//...
Ce n'mettre la fenêtre au premier plan si elle n'est pas réduite. Génial.
Si la fenêtre EST réduite, cependant, il reste réduite.
Il a besoin d'onu-minimiser.
Solution via SwitchToThisWindow (qui Fonctionne!):
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
[STAThread]
static void Main()
{
System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcessesByName(me.ProcessName);
foreach (System.Diagnostics.Process p in myProcesses)
{
if (p.Id != me.Id)
{
SwitchToThisWindow(p.MainWindowHandle, true);
return;
}
}
//now go ahead and start our application ;-)
source d'informationauteur Jude Allred | 2009-01-14
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et SwitchToThisWindow() a fonctionné le mieux pour moi. La seule limitation est que vous devez avoir XP sp1 est installé. J'ai joué avec SetForegroundWindow, ShowWindow, et ils avaient tous les deux des problèmes de traction dans la fenêtre de vue.
Même que l'OP, j'ai trouvé que
SetForegroundWindow
seul n'était pas suffisant lorsque la fenêtre a été réduite au minimum. Depuis que je ne voulais pas utiliser deSwitchToThisWindow
j'ai choisiShowWindow
suivie parSetForegroundWindow
.Fonctionne bien pour moi!
Je crois que vous voulez utiliser SetForegroundWindow
MSDN Exemple
Complet Note De Côté...
Vous pouvez utiliser
au lieu de boucler sur tous les processus en cours d'exécution sur le système...
Mise à JOUR
PInvoke Règles pour ce genre de chose...
C# équivalent de Tom Juergens de réponse. Fonctionne comme un charme pour moi.
Pouvez-vous attraper MainWindowHandle propriété de l'objet de Processus et de lui envoyer un message WM_USER que vous pouvez interpréter comme "exemple veut me ramener à l'avant".