Détecter le type de curseur de la couris [Résolu]

Signaler
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015
-
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015
-
Bonjour à toutes et à tous.

Comme il est dit dans le titre, je souhaite détecter le type de curseur de souris affiché. Pour être plus précis, je cherche à détecter quel curseur est affiché (ex : WaitCursor, IBeam ...) par Windows, et cela afin de pouvoir le remplacer par un curseur personnalisé approprié (dans mon programme uniquement).

Je sais déjà comment remplacer le curseur par un autre de son choix.

Je tiens à préciser que définir les curseurs à utiliser un par un à l'ouverture du programme est dans mon cas à éviter, car un trop grand nombre de formulaires sont présents dans mon projet.

Merci d'avance à toute réponse constructive,
désolé si les explication ne sont pas très simples, si besoin de précisions, je suis à disposition.

4 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
225
Bonjour,
Un "type de curseur" ne veut pas dire grand chose
D'autant qu'un curseur peut toujours avoir été personnalisé, voire carrément créé.
Je ne comprends pas pourquoi tu cherches à déterminer cela. Il te suffit d'imposer celui que tu veux en fonction du contexte de ton choix, quel que soit le curseur en vigueur avant celui que tu imposes !
Si tu cherches par contre à mémoriser le curseur système par défaut avant ton intervention en vue de le restituer ensuite, c'est autre chose (et c'est assez risqué, en cas notamment d'interruption brutale et inopinée).
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015

Je souhaite tout simplement (si cela l'est vraiment), déterminer le curseur qui est actuellement affiché par le système (WaitCursor lors d'une attente), afin de le remplacer par un personnalisé dans mon application, par soucis d'esthétique.
Je recherche donc juste une méthode permettant de connaître quel curseur est affiché par le système, afin de le remplacer par un personnalisé dans mon application seulement (si la souris sort de la fenêtre, le curseur devient à nouveau celui du système).

Je tiens à préciser que je suis sous Visual Studio 2013
Messages postés
6790
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
3 juin 2020
107
Bonjour,

  Public Shared Property Current As Cursor
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Current = New Cursor(Cursor.Current.Handle)
        MsgBox(Current.ToString)
    End Sub


Voilà
Messages postés
6790
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
3 juin 2020
107
Je tiens à préciser que dans ce cas c'est le curseur qui est attribué au Button1, a adapter donc!
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015
>
Messages postés
6790
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
3 juin 2020

merci,
je vais tester et je vous donne des nouvelles.
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015
>
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015

Après quelques tests, je pense que ce n'est pas le code adapté, c'est donc pour cela que je vais reformuler le problème.

Le code donné juste au dessus permet d'obtenir le curseur utilisé lors du clic sur le bouton (ou autre si réadaptation).

Or le problème se trouve là : ce que je voudrais, c'est que lorsque Windows affiche un curseur différent que celui par défaut (comme par exemple le WaitCursor lorsqu'il est nécessaire de faire patienter l'utilisateur), que cela puisse être détecté par le programme, pour ainsi mettre un curseur personnalisé à la place de ce fameux WaitCursor.

Cela nécessite donc de connaître quel curseur windows souhaite afficher, car connaître le curseur déjà utilisé poserait problème lorsque l'on a déjà défini un curseur personnalisé.

Bien entendu, le changement de curseur ne s'applique que dans l'application, mais cela, je sais déjà le faire.
Là où je suis bloqué est donc dans la détection du curseur que Windows souhaite afficher.

Merci d'avance, et encore désolé pour le dérangement.
Messages postés
6790
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
3 juin 2020
107
essaye ceci:

Public Class Form1
    Public Shared Property Current As Cursor
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Me.Cursor = Cursors.Hand
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Me.Cursor = Cursors.Cross
    End Sub
    Private Sub Form1_MouseEnter(sender As Object, e As System.EventArgs) Handles Me.MouseEnter
        Dim buttonToolTip As New ToolTip()
        Current = New Cursor(Cursor.Current.Handle)
        buttonToolTip.ToolTipTitle = "Curseur"

        buttonToolTip.UseFading = True

        buttonToolTip.UseAnimation = True

        buttonToolTip.IsBalloon = True

        buttonToolTip.ShowAlways = True

        buttonToolTip.AutoPopDelay = 5000

        buttonToolTip.InitialDelay = 1000

        buttonToolTip.ReshowDelay = 500

        buttonToolTip.IsBalloon = True

        buttonToolTip.SetToolTip(Me, Current.ToString)
    End Sub
End Class


a adapter
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015

Encore moi,

N'y aurait-il pas plutôt un moyen de définir tous les curseurs en remplacement de ceux de base que propose Windows par le code, et ceci pour qu'ils se chargent automatiquement si nécessaire ? (par exemple de l'affichage de l'IBeam personnalisé s'il s'agit d'une zone de texte)

Attention, je ne parle pas de définir les curseurs pour chaque contrôle un par un, mais de faire en sorte que ce soit les curseurs personnalisés qui soit affiché à la place de ceux que propose Windows.

merci d'avance.
Messages postés
6790
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
3 juin 2020
107 >
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015

Tu peux par exemple mettre un curseur d'attente pour une opération assez longue. Ensuite tu remets le curseur par défaut comme ceci:

  System.Windows.Forms.Cursor.Current = Cursors.WaitCursor
        ' System.Windows.Forms.Cursor.Current = Cursors.AppStarting 'au choix
        Dim i As Int32
        For i = 0 To 10000
            'Certains processus long
            Debug.Print(i.ToString())
        Next
        System.Windows.Forms.MessageBox.Show("Terminé!")
        System.Windows.Forms.Cursor.Current = Cursors.Default


voilà

@+ Le Pivert
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015
>
Messages postés
6790
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
3 juin 2020

Merci de ta réponse,

effectivement dans la majorité des cas, opérer de cette manière serait approprié, mais dans ma situation, il m'est nécessaire de remplacer l'ensemble des différents curseurs proposés par Windows, et cela temporairement.

Les définir pour chaque situation une par une serait beaucoup trop long.

je vais tenter quelques autres solutions (Je n'ai pas grand espoir qu'elles fonctionnent), et sinon, je m'en remettrait à toutes vos propositions.

Je vous mettrait un code source si je parviens à mes fins.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
225
Je n'ai apparemment pas dû/su être assez clair (ou insistant) :
1) les curseurs qu'utilise Windows sont tous ses propres curseurs/système.
Ils ont tous là (rien à voir avec VB) :
https://msdn.microsoft.com/en-us/library/windows/desktop/ms648395%28v=vs.85%29.aspx
2) la fonction GetCursor de la librairie User32 de l'Api de Windows retourne le handle du cursor en cours (handle correspondant à l'un de ceux montrés en 1))
3) modifier ce curseur est bien évidemment possible : utilisation de la fonction SetSystemCursor de la librairie user32 de l'Api de Windows. Le curseur de remplacement est à acquérir depuis un fichier par utilisatioin de la fonction LoadCursorFromFile de la librairie User32 de l'Api de Windows
4) le changement de curseur par Windows est le résultat d'un évènement et ne déclenche pas, lui, un évènement. Le repérer ne peut donc se faire que par l'utilisation d'un timer ou autre (addressof)
5) Je répète qu'il est très risqué de procéder à un tel changement.
(je l'ai dit plus haut et ai dit pourquoi). J'ajoute que ce changement n'affecte pas que l'appli en cours, mais toutes les applis en cours !
Voilà voilà ...

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
22
Date d'inscription
samedi 4 avril 2015
Statut
Membre
Dernière intervention
15 novembre 2015

Merci beaucoup,

je vais me contenter de définir les curseurs un par un.

Merci beaucoup pour votre aide.