Afficher une fenêtre externe au programme AlwaysOnTop

Raphykiki Messages postés 6 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 26 août 2008 - 24 août 2008 à 21:43
Raphykiki Messages postés 6 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 26 août 2008 - 26 août 2008 à 16:07
Bonsoir à tous,

J'aimerais que lorsque je clique sur mon bouton, la fenêtre qui a pour caption "Sans titre - Bloc-notes" se met au premier plan.

Par la suite, si je sais faire ça, je pourrais faire un thread qui met cette fenêtre au premier plan toutes les X secondes.
A par s'il y a une autre façon de faire dont j'aimerais connaître.

J'ai déjà fait mes recherches sur google et MSDN, il faut utiliser FindWindow, ShowWindow de la DLL user32. Mais après plusieurs essayes qui ne marchent pas, je décide donc de poster :p

Cordialement,
Raphael.

4 réponses

LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
25 août 2008 à 12:55
Salut Raphael,

Récemment, je suis tombé sur cette source
il y a une fonctionnalité interressante de mise au premier plan d'une application.

Si j'ai compris, c'est ce que tu charches à faire...
0
Raphykiki Messages postés 6 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 26 août 2008
25 août 2008 à 16:41
Je ne comprends pas trop le code source !

Je lance l'appli ( F5 ) et je constate qu'il n'y a rien de graphique :/

Tu pourrais peut être m'expliquer :S

Cordialement,
Raphael.
0
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
26 août 2008 à 10:05
Salut,

Effectivement il y a à boire et à manger là dedans... donc j'ai fait mes recherches en partant de MSDN :
GetWindowLong - http://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx
SetWindowPos - http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx
Pour les constantes - http://www.woodmann.com/fravia/sources/WINUSER.H

Alors, tout d'abord, voici les fonctions de l'API à importer ainsi que les constantes nécessaires :


[DllImport( "user32.dll" )]

public static extern long GetWindowLong( IntPtr hWnd, int nIndex );

public const int GWL_EXSTYLE = -20;

public const long WS_EX_TOPMOST = 0x00000008;


[DllImport( "user32.dll" )]

public static extern int SetWindowPos( IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags );

public const int HWND_TOPMOST = -1;

public const int HWND_NOTOPMOST = -2;

public const int SWP_NOSIZE = 0x0001;

public const int SWP_NOMOVE = 0x0002;

public const int SWP_SHOWWINDOW = 0x0040;

Pour savoir si une fenêtre à la propriété TopMost active :

private bool IsTopMost( IntPtr hWnd )
{
    return ( ( GetWindowLong( hWnd, GWL_EXSTYLE ) & WS_EX_TOPMOST ) != 0 );
}

Et pour activer/désactiver cette propriété :

private void ChangeTopMostPropertie(

IntPtr hWnd,

bool topMost )
{
    int topMostState = (
topMost ?
HWND_TOPMOST :
HWND_NOTOPMOST );
    SetWindowPos( hWnd,
topMostState

, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
}







La variable IntPtr doit être le handle d'une fenêtre, donc si tu utilises l'objet Process, il faut passer la propriété process.MainWindowHandle aux méthodes ci-dessus.

Voilà, n'hésites pas si tu as d'autres questions !!
0
Raphykiki Messages postés 6 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 26 août 2008
26 août 2008 à 16:07
Wouah !

Merci beaucoup, j'ai trouvé une autre solution moins longue :p

[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

 [DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

private void  button1_Click(object sender, EventArgs e)
{
     // On cherche la fenêtre
     IntPtr maFenetreHandle = FindWindow(null, "Nom de la fenêtre");
    
     // Vérification de la présence de la fenêtre
     if (maFenetreHandle == IntPtr.Zero)
    {
          MessageBox.Show("La fenetre n'est pas présente");
          return;
    }

    // On la met au premier plan et active
    SetForegroundWindow(maFenetreHandle);

    // Nous pouvons simuler des keys par exemple
    SendKeys.SendWait("Youuupi, j'ai réussi à mettre une fenetre au premier plan");
    SendKeys.SendWait("{ENTER}");
    SendKeys.SendWait("Et voilà que je simule du texte en plus !")
}

Cordialement,
Raphael.
0
Rejoignez-nous