Comment obtenir le titre de la fenêtre active actuelle en utilisant c #?

109

Je voudrais savoir comment saisir le titre de la fenêtre de la fenêtre active actuelle (c'est-à-dire celle qui a le focus) en utilisant C #.

d4nt
la source
2
Avez-vous essayé de déterminer quelle fenêtre de votre application a le focus ou quelle fenêtre de n'importe quelle application a le focus?
Peder Rice
ceci est pertinent stackoverflow.com/questions/2423234/… donc si vous vouliez cliquer sur un bouton pour le faire, alors cela vaut la peine de vous assurer que votre formulaire ne prend pas le focus.
barlop

Réponses:

165

Voir un exemple sur la façon dont vous pouvez faire cela avec le code source complet ici:

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

private string GetActiveWindowTitle()
{
    const int nChars = 256;
    StringBuilder Buff = new StringBuilder(nChars);
    IntPtr handle = GetForegroundWindow();

    if (GetWindowText(handle, Buff, nChars) > 0)
    {
        return Buff.ToString();
    }
    return null;
}

Édité avec les commentaires de @Doug McClean pour une meilleure exactitude.

Jorge Ferreira
la source
7
N'oubliez pas d'être un bon citoyen. blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx et blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx ont des informations pertinentes.
Greg D
3
une note newb, pour le faire fonctionner, using System.Runtime.InteropServices; et où placer l'importation de dll et les lignes externes statiques. coller dans la classe
barlop
1
@smink Comment obtenir la fenêtre de premier plan active pour un utilisateur spécifique (disons que le processus s'exécute en tant que service).
tchelidze le
Le site auquel vous avez lié n'est pas disponible. Voici (peut-être) l'archive Web de celui-ci: web.archive.org/web/20150814043810/http
//www.csharphelp.com
2
De plus, je souhaite que mon application soit notifiée chaque fois que la fenêtre de premier plan change. Y a-t-il un événement pour ça?
Piotrek
18

Si vous parliez de WPF, utilisez:

 Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);
Skvettn
la source
Si l'application entière n'est pas active (un autre programme a le focus), alors aucune fenêtre n'aura IsActive défini sur true.
Todd
En fait, cela pourrait être faux, dans mon cas, j'essayais d'accéder au tableau Window sur un thread non-UI. Cependant, voyez aussi ceci au cas où j'ai toujours raison: social.msdn.microsoft.com/Forums/vstudio/en-US/…
Todd
4

Bouclez Application.Current.Windows[]et trouvez celui avec IsActive == true.

shA.t
la source
11
Cela ne fonctionnerait-il pas uniquement pour les fenêtres de l'application .Net actuelle? Je pense que d4nt veut obtenir le titre de la fenêtre active actuelle sur le bureau, quelle que soit l'application à laquelle elle appartient.
Quagmire
2

Basé sur la fonction GetForegroundWindow | Microsoft Docs :

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowTextLength(IntPtr hWnd);

private string GetCaptionOfActiveWindow()
{
    var strTitle = string.Empty;
    var handle = GetForegroundWindow();
    // Obtain the length of the text   
    var intLength = GetWindowTextLength(handle) + 1;
    var stringBuilder = new StringBuilder(intLength);
    if (GetWindowText(handle, stringBuilder, intLength) > 0)
    {
        strTitle = stringBuilder.ToString();
    }
    return strTitle;
}

Il prend en charge les caractères UTF8.

Mohammad Dayyan
la source
0

S'il arrive que vous ayez besoin du formulaire actif actuel de votre application MDI : (MDI-Multi Document Interface).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;
Arthur Zennig
la source
-3

vous pouvez utiliser la classe de processus, c'est très simple. utiliser cet espace de noms

using System.Diagnostics;

si vous souhaitez créer un bouton pour activer la fenêtre.

private void button1_Click(object sender, EventArgs e)
    {            
       Process currentp = Process.GetCurrentProcess();
       TextBox1.Text = currentp.MainWindowTitle;  //this textbox will be filled with active window.
    }
B.Beshoo
la source
2
C'est faux. Il montrera le titre de votre programme pas de la fenêtre active actuelle.
isHuman