Bonjour,=20
ca fait quelques temps que je cherche une solution a ce=20
probleme mais je n'en voit aucune. J'ai un programme=20
(compos=E9 de petites fenetres) et j'aimerais bien que ce=20
programme reste toujours en arrire plan (derreire tous=20
les autres programmes, meme si on lui donne le focus). En=20
avant plan c facile, c pr=E9vu par C# mais pour qu'il soit=20
en arriere plan je ne trouve pas.
Une solution possible serait de rappeller tous les autres=20
programmes ouverts et de leur donner le focus pour qu'ils=20
se placent devant le mien mais a mon avis ca va etre=20
assez lent.
Est-ce que C# pr=E9voit de jouer avec un z-index (comme en=20
HTML) ?
A la limite j'aimerais que ce programme soit directement=20
incrust=E9 dans le fond d'ecran :) mais bon fo pas rever...
Merci d'avance !
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabrice MALAINGRE
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".
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
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".
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
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".
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
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".
[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
.
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".
[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
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".
[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