Минимизация формы системных окон в трее на С#, не видя, что она висит там, где панель задач

this.ShowInTaskbar = false;
this.WindowState = FormWindowState.Minimized;
//this.visible = false (Hotkeys stop working forever but the grey rest of the form would disappear from above taskbar)
ReRegisterHotkeys();

Я использую приведенный выше код, чтобы свернуть свое приложение с помощью значка в трее. Теперь свернутая остальная часть моей формы все еще висит в левом правом углу немного выше панели задач, где находится кнопка «Пуск». Видна только серая строка заголовка формы с маленьким «x», чтобы закрыть ее, и ее текст заголовка над строкой заголовка. Это очень странно. Я установил свою форму на «минимизированную» и не отображал ее на панели задач, и она все еще отображается. Я зарегистрировал горячие клавиши в своей форме, поэтому я не могу сделать ее «невидимой», иначе горячие клавиши каким-то образом перестанут работать, даже если я повторно зарегистрирую горячие клавиши после этого снова. Я пока не нашел альтернативы удалению этой свернутой подписи к форме, кроме как сделать ее «невидимой» или удалить ее заголовок, чего я также не хочу делать. Мне нужны заголовок, значок заголовка и область управления заголовка в этой программе, форма не должна стать окном инструментов или без границ.

Как сделать, чтобы эта серая часть формы над панелью задач исчезала, не устанавливая мою форму в окно инструментов и не делая ее полностью невидимой. Мои горячие клавиши должны по-прежнему работать после этого, и форма должна по-прежнему сохранять свой заголовок, значок и область управления, когда я снова верну ее в нормальное состояние.

Я взял свой код горячей клавиши из этого пример. Единственное отличие состоит в том, что я упаковал процедуру регистрации горячей клавиши в подфункцию с именем «ReRegisterHotkeys()».

Важно: проблема с отображением заголовка при свернутой форме не связана с зарегистрированными горячими клавишами. Это обычная "проблема C#". Если у меня есть форма, я минимизирую ее и делаю ее невидимой на панели задач, она по-прежнему отображает заголовок с «x» на панели задач. Это я хочу удалить, не делая форму невидимой или не удаляя стиль окна. «this.show» или «this.hide» ведут себя так же фатально, как и «this.visible=true/false», поскольку горячие клавиши исчезли. Я создаю свою форму, как показано по умолчанию, и не хочу, чтобы она уже была скрыта.

Это то, чего там не должно быть - как это удалить, не навредив: введите описание изображения здесь


person feedwall    schedule 14.07.2013    source источник
comment
Очевидно, что это вопрос XY. Переопределите метод OnHandleCreated() в классе формы и установите для него точку останова. Он должен ударить только один раз при запуске. Если после этого он сломается, посмотрите в стеке вызовов, чтобы найти в своем коде оператор, который воссоздал окно. В противном случае это также метод, при котором вам необходимо зарегистрировать ключи.   -  person Hans Passant    schedule 14.07.2013


Ответы (1)


Все, что вам нужно сделать, это вызвать Hide() и Show(), когда вы хотите скрыть и показать свою форму. ПРИМЕЧАНИЕ. Hide() также не будет отображаться на панели задач.

private void Form1_Resize(object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
        Hide();
}

Вы можете скрыть и показать NotifyIcon напротив формы, чтобы не отображалась иконка при отображении формы.

Очевидно, вам нужен NotifyIcon для отображения вашего приложения в системном трее.

В итоге ваш код будет выглядеть так:

private void Form1_Resize(object sender, EventArgs e)
{
    if (WindowState == FormWindowState.Minimized)
    {
        Hide();
        notifyIcon1.Visible = true;
    }
}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    Show();
    notifyIcon1.Visible = false;
    WindowState = FormWindowState.Normal;
}
person Nicolas Tyler    schedule 17.07.2013
comment
тогда почему бы не установить непрозрачность формы на 0%, чтобы скрыть ее, и на 100%, чтобы показать ее? - person Nicolas Tyler; 20.07.2013
comment
также вы пытались зарегистрировать горячую клавишу в отдельном классе? как в этой теме: stackoverflow.com/questions /2450373/ - person Nicolas Tyler; 20.07.2013
comment
мне удалось использовать горячие клавиши клавиатуры с приведенной выше ссылкой раньше в С#. но решать вам. - person Nicolas Tyler; 22.07.2013