2014-10-15 4 views
8

Я пытаюсь получить, находится ли курсор мыши над экраном рабочего стола. Вот мой код:Как узнать, находится ли курсор мыши над экраном рабочего стола?

[DllImport("user32.dll")] 
    public static extern bool GetCursorPos(out Point lpPoint); 

    [DllImport("user32.dll")] 
    public static extern IntPtr WindowFromPoint(Point Point); 

    [DllImport("user32.dll", SetLastError = false)] 
    public static extern IntPtr GetDesktopWindow(); 

    public static bool IsMouseOverDesktop() 
    { 
     Point mouseCursor; 
     GetCursorPos(out mouseCursor); 
     return WindowFromPoint(mouseCursor) == GetDesktopWindow(); 
    } 

но он не работает. Когда курсор мыши находится над рабочим столом, WindowFromPoint и GetDesktopWindow возвращают разные значения.

+5

Окно на рабочем столе может быть не таким, как вы думаете. Окно рабочего стола - самое верхнее окно. Это * не * окно, которое * explorer * создает и содержит значки, которые, как я думаю, является фактическим окном, которое вы пытаетесь определить, закончилась ли мышь. –

+0

Возможно, это поможет: http://stackoverflow.com/questions/9222451/what-is-the-difference-between-the-getdesktopwindow-and-openinputdesktop-apis-in – DonBoitnott

+1

Я не думаю, что это правильно сказать это самый верхний (я мог ошибаться, хотя). Точнее сказать, что он является родителем всех окон. Я бы рекомендовал открыть open spy ++ и выяснить, какое окно WindowFromPoint дает вам, а затем оттуда. –

ответ

1

Теперь с моей идеей вы можете решить вашу проблему так:

Используйте этот метод в коде формы.

public bool IsMouseOverDesktop() 
{ 
bool IsMouseOverDesktop = false; 
if ((Cursor.Position.X > this.Location.X) && ((Cursor.Position.X - this.Location.X) < this.Width) && (Cursor.Position.Y > this.Location.Y) && ((Cursor.Position.Y - this.Location.Y) < this.Height)) 
    IsMouseOverDesktop = false; 
else 
    IsMouseOverDesktop = true; 
return IsMouseOverDesktop; 
} 

Затем вызовите этот метод в событии и проверьте, является ли мышь над рабочим столом или нет.