Focus et Forms [Résolu]

Signaler
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009
-
Messages postés
2
Date d'inscription
vendredi 23 janvier 2004
Statut
Membre
Dernière intervention
6 octobre 2007
-
Salut,
voila le pb, j'ai plusieurs fenetres ouvertes, je voudrais savoir comment determiner laquelle a le focus et qu'il s'agisse de celle qui est en premiere vu de lutilisateur?
Pouvez-vous m'aidez?

13 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Voila un code tout simple, le titre de la fenêtre active ( si elle a un titre ) s'affiche dans la barre de titre de l'application, Pour que le test soit efficace il faut bien sûr que tu donne le focus à une autre application. Tu n'auras pas le titre pour les fenêtres de l'explorateur mais peu importe c'est juste un exemple "tout bête" pour te montrer comment utiliser le handle d'une fenêtre.

public partial class Form1 : Form
{
    #region Win32


    [ System.Runtime.InteropServices.DllImport( "user32.dll" ) ]
    private static extern IntPtr GetForegroundWindow( );


    #endregion // Win32


    private Timer t = null;


    public Form1( )
    {
        InitializeComponent( );


        t = new Timer( );
        t.Interval = 500;
        t.Tick += delegate
        {
            string caption = "???";
            IntPtr handle = GetForegroundWindow( );


            if ( handle == this.Handle )
            {
                caption = "Mon application à le focus.";
            }
            else if ( handle != IntPtr.Zero )
            {
                foreach ( Process p in Process.GetProcesses( ) )
                {
                    if ( p.MainWindowHandle == handle )
                    {
                        caption = p.MainWindowTitle;
                        break;
                    }
                }
            }


            this.Text = caption;
        };
        t.Start( );
    }
}
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009

PS: Je precise que je bosse avec C# VS version 2003

sandra
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut, Form.ActiveForm pour obtenir la forme active.
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009

je veux bien mais ca ne marche pas,
c'est ce que jai fait au debut mais le programme se bloque et m'affiche un message d'erreur:  "Object reference not set to an instance of an object." 

Tu aurais peut-etre une autre idee?

sandra
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Si tu as une référence nulle c'est qu'aucune forme n'est active dans ton application pour avoir la forme active du système il faut utiliser la fonction Win32 GetForegroundWindow.
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009

cad...
je ne connais pas Win32
peut tu maider un petit peu plus, je ne vois pas du tout comment faire

sandra
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Win32 c'est l'API de Windows, le framework est basé sur cette API.

Il faut définir le prototype de la fonction dans ton code :

[ System.Runtime.InteropServices.DllImport( "user32.dll" ) ]
private static extern IntPtr GetForegroundWindow( );

Puis appeller la méthode :

IntPtr handle = GetForegroundWindow( );
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009

Salut
je viens d utiliser ta fonction mais je ne sais pas quoi faire du parametre  handle
je ne suis pas du tout habituee a Win32 et je ne me suis jamais servi de Handle 
Peut tu me guider un peu encore stp?
Comment il va me servir a determiner la fenetre qui est en premier plan?

sandra
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Si ActiveForm renvoie null c'est qu' aucune fenêtre de ton application n'est active. Tu peux comparer le handle renvoyé par GetForegroundWindow avec le handle d'autres fenêtres. la classe Forme contient la propriété Handle. Tu peux également récupérer la liste des processus en cours et comparer leur handle de fenêtre ou encore manipuler la fenêtre grace à son handle via l'API Wiindows. etc..
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009

je viens de faire ce que tu ma conseille mais je ne pense pas avoir compris comment je dois faire
le pb est que je veux a partir dune classe, verifier quelle fenetre est en premier plan, jai utilise la fonction que tu ma donnee mais le handle reste toujours le meme chiffre
Je mexcuse mais est-ce que tu pourrai etre plus clair sur la marche a suivre parce que je n'y arrive pas.
Je n'ai pas non plus reussi a recuperer le handle d'une fentre en faisant Form2.Handle, l'ordi me dis que cest  pas possible
Est ce qie ti peut encore maider STP?
sandra
Messages postés
223
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
3 juin 2019
1
Génial et comment tu fais pour rendre le focus à ta Form ?

www.survey-copter.com
Messages postés
223
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
3 juin 2019
1
Ca marche je détecte la perte de focus mais quand le focus revient "Mon application à le focus" , je n'ai plus l'event keydown . Aurais-tu une idée ?
Merci

www.survey-copter.com
Messages postés
2
Date d'inscription
vendredi 23 janvier 2004
Statut
Membre
Dernière intervention
6 octobre 2007