Form n'apparaissant que lorsque le curseur est sur un bord de l'écran

Signaler
Messages postés
102
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
17 mars 2009
-
Messages postés
102
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
17 mars 2009
-
Bonjour,

Ma question est dans le sujet. Je souhaites faire une appli avec une form qui serait chargée au démarrage et cachée. Cette form n'apparaitrait que lorsque le curseur de la souris irait contre un bord de l'écran. Comme la barre des taches de windows.

Quelqu'un a une idée?

Merci d'avance

@ plus

lagoelle

16 réponses

Messages postés
216
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
17 septembre 2008

Salut, t'as essayé de tester la position de ton curseur ? Peut-être un truc du genre:

bool auBord = false;

auBord = (
(Cursor.Position.X >= SystemInformation.WorkingArea.Width)
&& (Cursor.Position.Y >= SystemInformation.WorkingArea.Height) );

while (auBord == false)
{
Form1.Hide();
}

if (auBord == true) // ce test n'est pas obligatoire je pense, tout dépend de ton traitement
{
Form1.Show();
}

enfin je ne suis pas certain de ce que je propose...

Enfin, pour l'information, WorkingArea c'est la zone du bureau (donc sans les barres de tâches) et tu précises pas réellement si tu veux que ta form apparaisse quand tu TOUCHE le bors ou quand t'ARRIVE dans la barre des taches...enfin autrement, au lieu de WorkingArea, t'as aussi PrimaryScreenSize qui peut peut-être te servir, ou VirtualScreen (mais je ne suis pas sûr que ça marche ça...)

"Un seul Être vous manque, et tout est dépeuplé..."
Messages postés
102
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
17 mars 2009

Merci pour l'idée, je vais essayé.... je te tiens au courant ;-)

@ plus

lagoelle
Messages postés
102
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
17 mars 2009

Mais, je pense à un souci: où mettre ce code ?

Le but est que cette form soit accessible dès que le curseur atteint, par exemple, le bord haut de l'écran. Et ce même si je suis sur d'autres applis...

@ plus

lagoelle
Messages postés
216
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
17 septembre 2008

niahahhhh!!!
. . . . j'en sais rien .. . lol
hmmm...tu voudrais que ton appli tourne en arrière plan en fait...en gros c'est ça...et qu'elle apparaisse quand tu touche un bord...un peu comme les barres outils Windows quoi...bah je sais qu'en Java y'a des Listener...J'imagine qu'il doit y'en avoir aussi en C#...si t'arrives à mettre un Listener sur l'évènement qui gère le mouvement du curseur ou peut-être sur l'événement qui gèrerait la position du curseur (du style quand il est supérieur ou égal aux limites du bureau/écran...)

Là je suis un peu dans le flou aussi, mais en tous cas ça m'intéresse par curiosité de savoir...on peut continuer à réfléchir à 2 si tu veux... :)

"Un seul Être vous manque, et tout est dépeuplé..."
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Quand le mouvement de la souris se fait en dehors du form ce n'est pas si simple.
Le seul moyen que je connaisse c'est un hook global (system-wide hook).
Mais il doit bien y avoir plus simple que ça (enfin, j'espère pour toi)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
216
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
17 septembre 2008

. . . euh je relève pas...lol je sais même pas de quoi il parle là donc euuuhh....je pensais pas que mon idée était la meilleure c'est sûr mais je voyais vraiment pas comment faire autrement...(d'un autre côté mes connaissances sont bien limitées étant donné que je débute :-D)

"Un seul Être vous manque, et tout est dépeuplé..."
Messages postés
102
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
17 mars 2009

J'ai essayé ça:

#region Using directives


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;


#endregion


namespace WindowsApplication1
{
partial class Form1 : Form
{
public bool AuBord;
public Form1()
{
InitializeComponent();
}


private void Form1_Load(object sender, EventArgs e)
{
this.Hide();
}


private void Form1_MouseMove(object sender, MouseEventArgs e)
{
AuBord = (Cursor.Position.Y >= SystemInformation.WorkingArea.Height);


if (AuBord == true)
{
this.Show ();
}
}


private void button1_Click(object sender, EventArgs e)
{
this.Hide();
}
}
}

mais ça marche pas...
Par contre, coq, je suis comme sphaxslayer, je comprends pas du tout le hook
Tant pis, si c'est trop compliqué, je vais gérer différemment... :-(

@ plus

lagoelle
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Le MouseMove du Form n'est déclenché que quand le pointeur est justement sur le Form, donc ça ne marchera pas.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
216
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
17 septembre 2008

pas bête...en fait je me demande si c'est réellement faisable ce chose...enfin bon...'doit bien y'avoir un moyen même détourné...et si tu joues sur le MouseLeave dans la Form, et que dans l'action tu lui demandes de boucler sur la position du pointeur justment...? nan....?

"Un seul Être vous manque, et tout est dépeuplé..."
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Une solution serait d'utiliser un Timer (intervalle d'une seconde ça devrait etre suffisant) pour verifier la position du curseur et afficher ou non le form.
Ce serait même moins lourd que de traiter tout les messages de deplacement de la souris (ça en fait un paquet par secondes ^^)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Sinon si, le hook global c'est faisable, mais pas completement en managé.
Ce que je me demande c'est s'il n'y aurais pas une notification toute prete dans les APIs pour prevenir de l'arrivée du curseur sur un des bord de l'écran.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
102
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
17 mars 2009

Je vais essayer avec le timer, c'est ce qui parait le plus simple ;-)

@ plus

lagoelle
Messages postés
102
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
17 mars 2009

J'ai pensé à une petite astuce: mettre une form de la largeur de l'écran et d'un pixel ou 2 de haut en position "toujours au dessus des autres fenetres", et gérer ainsi avec l'évenement mouse_enter.
Le hic c'est qu'il semble que VS n'accepte pas une hauteur inférieure à 24...
Si vous avez une idée ;-)

Sinon, dans le meme esprit, il faudrait dire à l'ordi que l'espace de travail est réduit de façon à créer une autre barre style démarrer....

@ plus

lagoelle
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Jette un coup d'oeil à ceci : http://www.codeproject.com/csharp/csdoesshell3.asp

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
216
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
17 septembre 2008

sympa le lien merci coq :)

"Un seul Être vous manque, et tout est dépeuplé..."
Messages postés
102
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
17 mars 2009

excellent !!! Merci coq

@ plus

lagoelle