2009-04-13 16 views
11

मैं निष्क्रिय समय के बाद अपना माउस कर्सर छिपाना चाहता हूं और जब मैं माउस को ले जाता हूं तो यह दिखाया जाएगा। मैंने टाइमर का उपयोग करने की कोशिश की लेकिन यह अच्छी तरह से काम नहीं किया। कोई भी मेरी मदद कर सकता हैं? कृप्या!निष्क्रिय समय के बाद माउस कर्सर छुपाएं

+0

क्या प्रौद्योगिकी? Winforms, WPF, Silverlight, ASP.Net –

उत्तर

10

यहां यह कैसे किया जाए इसका एक संक्षिप्त उदाहरण है।

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

मुझे कर्सर के लिए 'कर्सर। हाइड' नहीं मिल रहा है। – lindexi

21

आप WinForms का उपयोग कर रहे हैं और केवल Windows मशीनों पर तैनात होगा तो यह user32 GetLastInputInfo उपयोग करने के लिए दोनों माउस और कीबोर्ड सुस्ती को संभालने के लिए काफी आसान है: आप शायद कुछ याद आ रही तर्क यह है कि कर्सर की दृश्यता अधिभावी रहा था।

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

और फिर अपने 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

एक सुरुचिपूर्ण समाधान, धन्यवाद – frameworkninja

+0

पर्यावरण के लिए खाते। टिककाउंट नकारात्मक है: – mikesl

3

Environment.Tickcount नकारात्मक किया जा रहा है के लिए खाते में करने की आवश्यकता में:

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; 
    } 
} 
संबंधित मुद्दे