Envoyer un programme en arriere plan

Le
JB
Bonjour,
ca fait quelques temps que je cherche une solution a ce
probleme mais je n'en voit aucune. J'ai un programme
(compos de petites fenetres) et j'aimerais bien que ce
programme reste toujours en arrire plan (derreire tous
les autres programmes, meme si on lui donne le focus). En
avant plan c facile, c prvu par C# mais pour qu'il soit
en arriere plan je ne trouve pas.
Une solution possible serait de rappeller tous les autres
programmes ouverts et de leur donner le focus pour qu'ils
se placent devant le mien mais a mon avis ca va etre
assez lent.
Est-ce que C# prvoit de jouer avec un z-index (comme en
HTML) ?
A la limite j'aimerais que ce programme soit directement
incrust dans le fond d'ecran :) mais bon fo pas rever
Merci d'avance !
Vos réponses
Trier par : date / pertinence
Fabrice MALAINGRE
Le #12419711
Bonsoir JB,

La solution à votre problème réside dans la surcharge de la méthode
"WndProc" !

En effet, lorsqu'il est nécessaire de prévenir/modifier le comportement
natif d'une fenêtre, il n'existe rien de mieux que d'intercepter le message
correspondant à ce comportement.

Dans le cas qui nous occupe, il s'agit du message "WM_WINDOWPOSCHANGING".

La marche à suivre est donc la suivante :

1. Ajouter un using des "System.Runtime.InteropServices".

2. Déclarer deux constantes :
private const UInt32 WM_WINDOWPOSCHANGING = 0x46;
private const UInt32 HWND_BOTTOM = 0x01;

3. Déclarer la structure associée au message WINDOWPOSCHANGING :
[StructLayout(LayoutKind.Sequential)]
private struct WINDOWPOS
{
public UInt32 hwnd;
public UInt32 hwndInsertAfter;
public Int32 x;
public Int32 y;
public Int32 cx;
public Int32 cy;
public UInt32 flags;
}

4. Et enfin surcharger la méthode WndProc de votre formulaire :
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_WINDOWPOSCHANGING)
{
unsafe
{
WINDOWPOS* positionInfoPtr = (WINDOWPOS*) m.LParam;
// Always be at the bottom of the Z-Order
positionInfoPtr->hwndInsertAfter = HWND_BOTTOM;
}
}
else
{
base.WndProc(ref m);
}
}


Et voilà ! Le tour est joué.

Ah ! Ne pas oublier d'autoriser le code unsafe dans votre projet (Propriétés
du projet => Propriétés de configuration => Générer)

Cordialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Le #12419571
Salut !
C'est impeccable ! je ne pense pas assez souvent à
utiliser les fonctionnalités de bases.. et c'est bien
dommage ! Ton code marche à merveille et il est d'une
simplicité déconcertante.
Merci beaucoup
JB.


-----Message d'origine-----
Bonsoir JB,

La solution à votre problème réside dans la surcharge de


la méthode
"WndProc" !

En effet, lorsqu'il est nécessaire de prévenir/modifier


le comportement
natif d'une fenêtre, il n'existe rien de mieux que


d'intercepter le message
correspondant à ce comportement.

Dans le cas qui nous occupe, il s'agit du


message "WM_WINDOWPOSCHANGING".

La marche à suivre est donc la suivante :

1. Ajouter un using des "System.Runtime.InteropServices".

2. Déclarer deux constantes :
private const UInt32 WM_WINDOWPOSCHANGING = 0x46;
private const UInt32 HWND_BOTTOM = 0x01;

3. Déclarer la structure associée au message


WINDOWPOSCHANGING :
[StructLayout(LayoutKind.Sequential)]
private struct WINDOWPOS
{
public UInt32 hwnd;
public UInt32 hwndInsertAfter;
public Int32 x;
public Int32 y;
public Int32 cx;
public Int32 cy;
public UInt32 flags;
}

4. Et enfin surcharger la méthode WndProc de votre


formulaire :
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_WINDOWPOSCHANGING)
{
unsafe
{
WINDOWPOS* positionInfoPtr = (WINDOWPOS*)


m.LParam;
// Always be at the bottom of the Z-Order
positionInfoPtr->hwndInsertAfter = HWND_BOTTOM;
}
}
else
{
base.WndProc(ref m);
}
}


Et voilà ! Le tour est joué.

Ah ! Ne pas oublier d'autoriser le code unsafe dans


votre projet (Propriétés
du projet => Propriétés de configuration => Générer)

Cordialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr



.



Publicité
Poster une réponse
Anonyme