2009-04-13 5 views
11

유휴 시간이 지난 후 마우스 커서를 숨기고 마우스를 움직이면 표시됩니다. 타이머를 사용하려고했지만 제대로 작동하지 않았습니다. 아무도 나를 도울 수 있습니까? 부디!유휴 시간이 지난 후 마우스 커서를 숨기기

+0

어떤 기술? Winforms, WPF, silverlight, ASP.Net –

답변

10

다음은이를 수행하는 방법에 대한 인위적인 예제입니다. 당신이 윈폼을 사용하고 있습니다 만 Windows 시스템에 배포 할 경우

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

커서가 'Cursor.Hide'를 찾을 수 없습니다. – lindexi

21

다음은 마우스와 키보드 모두 공회전 처리 할 수 ​​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; 
    } 
} 
관련 문제