Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как запретить сворачивание формы?


Автор: Riccon 30.4.2007, 11:47
Добрового дня, господа.
У меня такая задача. На десктопе должно висеть окошко для показывания всякой шизы(рекламной). Причём висеть оно должно постоянно и не мешая работе других приложений. Что-то вроде часов у висты. 

Так вот вопрос в том, как сделать так, чтоб это окно невозможно было свернуть?

Автор: Retro 30.4.2007, 12:28
Убрать минимайз(или вообще весь бордер), сделать прозрачным(как опция) и не отображать на панели.
Закрывать по кнопке.

Автор: Riccon 30.4.2007, 12:47
Спаисбо. Только поясните подробнее про это:
Цитата

сделать прозрачным(как опция)


Мне-то еще нужно, чтоб по Win+D окно не сворачивалось.

Автор: Retro 30.4.2007, 14:21
Цитата(Riccon @  30.4.2007,  11:47 Найти цитируемый пост)
Только поясните подробнее про это:
Цитата

сделать прозрачным(как опция)

Это просто спецэффект. По надобности.

Насчет Win+D не уверен. Я поставил TopMost = true; и по Win+D оно не сворачивается. Если подходит то пожалуйста.

Где-то так:
Код

            this.ShowInTaskbar = false;
            this.FormBorderStyle = FormBorderStyle.None;
            this.TopMost = true;

Автор: Riccon 1.5.2007, 11:35
Не, TopMost не подходит. Эта панелька должна быть как бы элементом десктопа, подобно иконкам.  Её могут перекрывать другие окна. Только сворачиваться не должна.

Автор: archeg 1.5.2007, 11:38
Цитата(Riccon @ 1.5.2007,  11:35)
Не, TopMost не подходит. Эта панелька должна быть как бы элементом десктопа, подобно иконкам.  Её могут перекрывать другие окна. Только сворачиваться не должна.

Разварачивай ее в таймере  smile

Добавлено через 13 минут и 7 секунд
Может быть это поможет:
Код

 public partial class Form1 : Form
    {
        System.Timers.Timer timer;
        DateTime TTL;
        InvokeDelegate d1;
        public Form1()
        {
            timer = new System.Timers.Timer(100.0f);
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Start();
            InitializeComponent();
            d1 = Change;
        }

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            try
            {
                Invoke(d1);
            }
            catch
            {
                this.Close();
            }
        }

        delegate void InvokeDelegate();
        void Change()
        {
            if (TTL.AddMilliseconds(100.0f) < DateTime.Now)
            {
                this.WindowState = FormWindowState.Normal;
            }
        }

        void timer_Tick(object sender, EventArgs e)
        {
            if (TTL.AddMilliseconds(100.0f) < DateTime.Now)
            {
                this.WindowState = FormWindowState.Normal;
            }
        }

        private void richTextBox1_Validated(object sender, EventArgs e)
        {
            TTL = DateTime.Now;
        }
    }

Написал быстро, может можно лучше

Автор: Riccon 2.5.2007, 09:22
Цитата

Разварачивай ее в таймере

В принципе - выход, учитывая, что таймер там будет работать постоянно. Поставил бы плюс за оригинальность решения, но 100 постов нету. По этому, просто, спасибо smile

Хотя, наверняка, предпочтительнее отловить нужное событие. А какие события возникают у формы при нажатии Win+D или Win+M я не представляю как узнать.:(

Автор: Naum 2.5.2007, 12:47
Можно по событию SizeChanged проверять, если WindowState == Minimize, тогда разворачивать. А еще где-то на форуме уже обсуждалось как можно перехватывать нажатие клавиш, и обрабатывать их самому.

Автор: encaps 13.7.2007, 21:34
Цитата(Retro @  30.4.2007,  12:28 Найти цитируемый пост)
Убрать минимайз

ну так как же отменить сворачивание формы?

Автор: mr.DUDA 13.7.2007, 23:00
encaps, неужто из вышеприведённых постов неясно как это сделать ?

Автор: NURMS 14.7.2007, 22:52
Я что-то не понял. А просто в опциях поставить MinimizeBox = False yне пойдёт?

Автор: Retro 14.7.2007, 23:31
Цитата(NURMS @  14.7.2007,  21:52 Найти цитируемый пост)
Я что-то не понял. А просто в опциях поставить MinimizeBox = False yне пойдёт? 

Вопрос, ИМХО, стоял больше о горячих клавишах - win+d.
Если TopMost не подходит то archeg уже ответил, разворачивать по таймеру.

Автор: Atiskara 9.8.2010, 07:28
Код

        {
            if (TTL.AddMilliseconds(100.0f) < DateTime.Now)
            {
                this.WindowState = FormWindowState.Normal;
            }
        }


Спасибо за реализованный таймер. Я его использовала для всяких разных вещей, но вот по прямому назначению не удалось. При присваивании нового значения свойству WindowState нормализация окна не происходит((.
Кто может подсказать в чем причина?

Кстати да, приложение разрабатываю на VS2010 WPF.

Автор: IGV 13.8.2010, 18:33
эм....ну как бы вам сказать...с точки зрения пользователя, я бы вас убил за такие вещи, а с точки зрения программиста могу посоветовать почитать здесь насчет сабжа:
http://www.codeproject.com/KB/dotnet/DesktopWidget.aspx

а так для этого нужно дергать WinAPI.

Автор: Planeworld 5.12.2010, 16:11
Перехватываем команду, и подменяем её такой же но без handle-а вашего окна. как уже писалось выше winapi
имхо самое стабильное и не юзерфрендлиsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)