2009-04-13 12 views
11

Chcę ukryć kursor myszy po czasie bezczynności i zostanie wyświetlony, gdy poruszę myszą. Próbowałem użyć timera, ale nie działało dobrze. Czy ktoś może mi pomóc? Proszę!Ukryj kursor myszy po czasie bezczynności

+0

jakiej technologii? WinForm, WPF, silverlight, ASP.Net –

Odpowiedz

10

Oto wymyślny przykład tego, jak to zrobić. Prawdopodobnie trzeba było trochę brakuje logiki, która została unieważniając widoczność kursora:

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

Nie mogę znaleźć 'Cursor.Hide' dla Cursora. – lindexi

21

Jeśli używasz WinForms i będzie wdrożyć tylko na komputerach z systemem Windows to jest to dość łatwe w użyciu user32 GetLastInputInfo obsługiwać zarówno myszy i klawiatury na biegu jałowym.

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; 
    } 
} 

A potem w swojej 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

eleganckie rozwiązanie, dziękuję – frameworkninja

+0

Aby obliczyć Environment.Tickcount jest ujemny: – mikesl

3

należy uwzględnić Environment.Tickcount jest ujemny:

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; 
    } 
} 
Powiązane problemy