РЕДАКТИРОВАТЬ: Я собираюсь оставить этот ответ здесь, хотя он не может быть надежно работать. Причина: помешать кому-то другому попробовать то же самое. Смотрите конец сообщения по той причине, что оно не будет работать.
Вы можете сделать это довольно легко для клиентского прямоугольника, получив позицию курсора и проверив, находится ли он в клиентской области формы:
private void Form1_MouseLeave(object sender, EventArgs e)
{
Point clientPos = PointToClient(Cursor.Position);
if (!ClientRectangle.Contains(clientPos))
{
this.Opacity = 0.25;
}
}
Предполагается, что ни один из ваших дочерних элементов управления не изменит непрозрачность.
Однако вы обнаружите, что это далеко не идеальное решение, потому что, когда мышь переходит к строке заголовка, форма переходит на 0,25%. Это можно исправить, проверив, находится ли позиция мыши внутри прямоугольника окна (используя свойство Bounds), но тогда ваше окно останется непрозрачным, если мышь переместится за пределы строки заголовка и из окна.
У вас похожая проблема при вводе строки заголовка снаружи.
Я думаю, вам придется обрабатывать сообщения WM_NCMOUSEENTER
и WM_NCMOUSELEAVE
, чтобы сделать эту работу надежной.
Почему это не может работать:
Даже обработка уведомлений, не относящихся к области клиента, может дать сбой. Мышь может войти в дочерний элемент управления, что предотвратит уведомление формы.