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 #.


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.


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);

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.


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.


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;

-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.
    }

2
C'est faux. Il montrera le titre de votre programme pas de la fenêtre active actuelle.
— isHuman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.