2009-04-13 11 views
11

Je veux cacher mon curseur de souris après un temps d'inactivité et il apparaîtra lorsque je bougerai la souris. J'ai essayé d'utiliser une minuterie mais cela n'a pas bien fonctionné. Quelqu'un peut-il m'aider? S'il vous plaît!Cacher le curseur de la souris après un temps d'inactivité

+0

ce que la technologie? Winforms, WPF, Silverlight, ASP.Net –

Répondre

10

Voici un exemple inventé de la façon de le faire. Vous avez probablement eu une certaine logique manquante qui était PRÉPONDÉRANTS la visibilité du curseur:

public partial class Form1 : Form 
{ 
    public TimeSpan TimeoutToHide { get; private set; } 
    public DateTime LastMouseMove { get; private set; } 
    public bool IsHidden { get; private set; } 

    public Form1() 
    { 
     InitializeComponent(); 
     TimeoutToHide = TimeSpan.FromSeconds(5); 
     this.MouseMove += new MouseEventHandler(Form1_MouseMove); 
    } 

    void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     LastMouseMove = DateTime.Now; 

     if (IsHidden) 
     { 
      Cursor.Show(); 
      IsHidden = false; 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     TimeSpan elaped = DateTime.Now - LastMouseMove; 
     if (elaped >= TimeoutToHide && !IsHidden) 
     { 
      Cursor.Hide(); 
      IsHidden = true; 
     } 
    } 
} 
+0

Je ne peux pas trouver le 'Cursor.Hide' pour Cursor est de type. – lindexi

21

Si vous utilisez WinForms et ne déployer sur les machines Windows, alors il est très facile à utiliser user32 GetLastInputInfo pour gérer à la fois la marche au ralenti souris et le clavier.

public static class User32Interop 
{ 
    public static TimeSpan GetLastInput() 
    { 
    var plii = new LASTINPUTINFO(); 
    plii.cbSize = (uint)Marshal.SizeOf(plii); 

    if (GetLastInputInfo(ref plii)) 
     return TimeSpan.FromMilliseconds(Environment.TickCount - plii.dwTime); 
    else 
     throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

    struct LASTINPUTINFO 
    { 
    public uint cbSize; 
    public uint dwTime; 
    } 
} 

Et puis dans votre Form

public partial class MyForm : Form 
{ 
    Timer activityTimer = new Timer(); 
    TimeSpan activityThreshold = TimeSpan.FromMinutes(2); 
    bool cursorHidden = false; 

    public Form1() 
    { 
    InitializeComponent(); 

    activityTimer.Tick += activityWorker_Tick; 
    activityTimer.Interval = 100; 
    activityTimer.Enabled = true; 
    } 

    void activityWorker_Tick(object sender, EventArgs e) 
    { 
    bool shouldHide = User32Interop.GetLastInput() > activityThreshold; 
    if (cursorHidden != shouldHide) 
    { 
     if (shouldHide) 
     Cursor.Hide(); 
     else 
     Cursor.Show(); 

     cursorHidden = shouldHide; 
    } 
    } 
} 
+0

une solution élégante, merci – frameworkninja

+0

Pour tenir compte de Environment.Tickcount étant négatif: – mikesl

3

Nécessité de tenir compte Environment.TickCount être négatif:

public static class User32Interop 
{ 

    public static TimeSpan GetLastInput() 
    { 
     var plii = new LASTINPUTINFO(); 
     plii.cbSize = (uint)Marshal.SizeOf(plii); 

     if (GetLastInputInfo(ref plii)) 
     { 
      int idleTime = unchecked(Environment.TickCount - (int)plii.dwTime); 
      return TimeSpan.FromMilliseconds(idleTime); 
     } 
     else 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

    struct LASTINPUTINFO 
    { 
     public uint cbSize; 
     public uint dwTime; 
    } 
} 
Questions connexes