Показать winform над областью уведомлений

Я хочу показать winform в самом правом нижнем углу чуть выше системного трея,

Как я могу это сделать? Вот мой код:

public static void Notify()
{        
    Rectangle workingArea = Screen.PrimaryScreen.WorkingArea;
    Form fm = new Form();
    fm.ClientSize = new Size(200, 200);
    int left = workingArea.Width - fm.Width;
    int top = workingArea.Height - fm.Height;
    fm.Location = new Point(left, top);
    fm.ShowInTaskbar = false;
    fm.ShowIcon = false;
    fm.MinimizeBox = false;
    fm.MaximizeBox = false;
    fm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
    fm.Text = "Test";
    fm.TopMost = true;
    fm.Show();
}

person Data-Base    schedule 04.09.2010    source источник


Ответы (3)


Я только что попробовал это, и у меня это сработало (примечание: этот код должен появиться после первого отображения формы — например, вы можете поместить его в обработчик события Load формы или просто включать его после любого вызова Show):

Rectangle workingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
int left = workingArea.Width - this.Width;
int top = workingArea.Height - this.Height;

this.Location = new Point(left, top);

Использовать ли WorkingArea или Bounds зависит от того, что вы подразумеваете под «над»: если вы имеете в виду «перед», то используйте Bounds, так как оно включает область, покрывающую весь экран (включая пространство, занимаемое системным треем); если вы имеете в виду «выше», то используйте WorkingArea, который включает только рабочий стол пользователя.

Также позвольте мне уточнить, что вы хотите, чтобы ваша фактическая форма отображалась там, верно? Если вам нужен значок в области уведомлений, это то, что NotifyIcon компонент предназначен для.

person Dan Tao    schedule 04.09.2010
comment
@Data-Base: переместите строки, определяющие местоположение формы, на после вызова Show. Windows Forms делает странную вещь, когда кажется, что она игнорирует вас, когда вы устанавливаете свойство Location до того, как форма будет показана в первый раз. - person Dan Tao; 05.09.2010
comment
Я просто использовал fm.StartPosition = FormStartPosition.Manual; код от Ханса Пассанта, и это сработало :-) - person Data-Base; 05.09.2010

Вы забыли вот это:

        fm.StartPosition = FormStartPosition.Manual;

Далее вам нужно будет поработать над размещением панели задач, скажем, в левой части экрана и запуском кода на компьютере с другим значением DPI для видео (например, 125). Вы можете точно позиционировать форму только в ее событии Load. Не устанавливайте размер клиента.

person Hans Passant    schedule 05.09.2010

Если вы хотите расположить форму над/перед панелью задач:

Задайте для свойства формы TopMost значение true. Вы можете использовать Screen.PrimaryScreen.Bounds, чтобы получить разрешение экрана, а затем соответствующим образом установить положение формы.


Если вы просто хотите разместить форму чуть выше панели задач в правом нижнем углу, вы можете сделать следующее:

В конструкторе форм перейдите в «Свойства» -> «События» и добавьте в форму событие «Загрузка».

Добавьте следующее:

private void Form1_Load(object sender, EventArgs e)
{
    this.StartPosition = FormStartPosition.Manual;
    int x = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
    int y = Screen.PrimaryScreen.WorkingArea.Height - this.Height;
    this.Bounds = new Rectangle(x, y, this.Width, this.Height);
}
person hydrogen    schedule 04.09.2010
comment
Я думаю, что ОП имел в виду, как указано выше, а не поверх; поэтому TopMost не подходит. Хотя могу ошибаться. - person Dan Tao; 05.09.2010
comment
Правда, что .. ну теперь у него есть варианты :) - person hydrogen; 05.09.2010
comment
Спасибо большое, теперь я исправил свой вопрос :-) - person Data-Base; 05.09.2010