Как получить контроль над курсором мыши?

У меня есть форма с несколькими кнопками, и я хочу знать, какая кнопка находится под курсором.

PS Может быть, это дубликат, но я не могу найти ответ на этот вопрос.

Посмотрите на GetChildAtPoint . Вам нужно будет выполнить дополнительную работу, если элементы управления содержатся в контейнере, см. Control.PointToClient .

Возможно, GetChildAtPoint и PointToClient – первая идея для большинства людей. Я также использовал его в первую очередь. Но GetChildAtPoint работает неправильно с невидимыми или перекрывающимися элементами управления. Вот мой хороший рабочий код, и он управляет этими ситуациями.

 using System.Drawing; using System.Windows.Forms; public static Control FindControlAtPoint(Control container, Point pos) { Control child; foreach (Control c in container.Controls) { if (c.Visible && c.Bounds.Contains(pos)) { child = FindControlAtPoint(c, new Point(pos.X - c.Left, pos.Y - c.Top)); if (child == null) return c; else return child; } } return null; } public static Control FindControlAtCursor(Form form) { Point pos = Cursor.Position; if (form.Bounds.Contains(pos)) return FindControlAtPoint(form, form.PointToClient(pos)); return null; } 

Это даст вам контроль прямо под курсором.

 // This getYoungestChildUnderMouse(Control) method will recursively navigate a // control tree and return the deepest non-container control found under the cursor. // It will return null if there is no control under the mouse (the mouse is off the // form, or in an empty area of the form). // For example, this statement would output the name of the control under the mouse // pointer (assuming it is in some method of Windows.Form class): // // Console.Writeline(ControlNavigatorHelper.getYoungestChildUnderMouseControl(this).Name); public class ControlNavigationHelper { public static Control getYoungestChildUnderMouse(Control topControl) { return ControlNavigationHelper.getYoungestChildAtDesktopPoint(topControl, System.Windows.Forms.Cursor.Position); } private static Control getYoungestChildAtDesktopPoint(Control topControl, System.Drawing.Point desktopPoint) { Control foundControl = topControl.GetChildAtPoint(topControl.PointToClient(desktopPoint)); if ((foundControl != null) && (foundControl.HasChildren)) return getYoungestChildAtDesktopPoint(foundControl, desktopPoint); else return foundControl; } } 

Что касается определения события on-Mouse-over в каждой кнопке, которое назначает кнопку отправителя общедоступной переменной типа кнопки

Вы можете сделать это несколькими способами:

  1. Прослушайте событие MouseEnter элементов управления формы. Параметр «отправитель» сообщит вам, какой контроль поднял событие.

  2. Получите позицию курсора, используя System.Windows.Forms.Cursor.Location и сопоставьте ее с координатами своей формы с помощью Form.PointToClient() . Затем вы можете передать точку в Form.GetChildAtPoint() чтобы найти элемент управления под этой точкой.

Андрей

  • Скрыть кнопки TabControl для управления сложными панелями
  • Модель-View-Presenter в WinForms
  • Не удается закрыть Excel.exe после процесса Interop
  • Несколько streamов пользовательского интерфейса - Winforms
  • Отключение анимации прогресса проекта .NET при изменении значения?
  • Как перемещать и изменять размер формы без границы?
  • SendKeys.Send и ключ Windows
  • Создание WinForms TextBox ведет себя как адресная строка вашего браузера
  • Просмотр PDF в формах Windows с использованием C #
  • как изменить цвет заголовка Winform DataGridview?
  • Добавьте несколько изображений в тело электронной почты (inline) с помощью приложения windows c #
  • Interesting Posts
    Давайте будем гением компьютера.