C # - проблема с окном всегда сверху

Итак, я делаю оверлей, и мне нужно, чтобы он всегда был сверху. Для этого я просто установил

chackBox1.checked = true;

private void checkChanged(object sender, EventArgs e)
{
        this.TopMost = checkBox1.Checked;
}  

как это предлагается во многих местах. Проблема здесь в том, что 1) мне нужна кнопка-флажок... но это не проблема, я могу установить Visible = false. 2) Это никогда не работает, пока я не поставлю галочку вручную с помощью мыши! Даже если я устанавливаю флажок, устанавливаю form1.isTopMost = true (после initComponents) и вызываю событие checkChanged, мне всегда приходится вручную устанавливать флажок, прежде чем он всегда останется наверху!

пожалуйста помоги! Как сделать так, чтобы оверлей загружался всегда сверху?

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

Спасибо,

Дэйв


person David Menard    schedule 24.06.2011    source источник
comment
Почему бы вам просто не установить TopMost в инспекторе свойств формы и не снять флажок?   -  person Lasse V. Karlsen    schedule 24.06.2011
comment
Я не знаком с инспектором по имуществу, не могли бы вы дать мне более подробную информацию, пожалуйста? Я использовал флажок, потому что это то, что использовалось во всех примерах.   -  person David Menard    schedule 24.06.2011
comment
@David: он имеет в виду свойства элемента управления в Visual Studio.   -  person    schedule 24.06.2011
comment
Я пробовал, выдает тот же результат   -  person David Menard    schedule 24.06.2011
comment
@David: Как насчет вызова .Show() в форме TopMost после того, как вы установили TopMost = true?   -  person    schedule 24.06.2011
comment
Хорошо, что я сделал, если установил TopMost = true как для событий focus, так и для unfocus для моего окна, и, кажется, это работает после того, как я .Show() окна после инициализации! Спасибо за помощь, ребята!   -  person David Menard    schedule 24.06.2011
comment
@David: ты должен сделать это ответом и принять его   -  person    schedule 24.06.2011
comment
Я сделал! :D дал вам точку! спасибо!   -  person David Menard    schedule 24.06.2011


Ответы (3)


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

Вы должны активировать MessageBox в событии checkChanged(..) для отображения, когда вы программно устанавливаете для checkBox1 значение true или устанавливаете флажок вручную. Это поможет в отладке. Поскольку checkChanged не является типичным именем по умолчанию для этого типа событий, я предполагаю, что вы изменили его, чтобы оно могло указывать на другую функцию обработчика событий.

person Community    schedule 24.06.2011

Настройка Topmost = true на getfocus и lostfocus работает, по-видимому, до тех пор, пока у вас не появится всплывающее окно сообщения из какого-либо EXE, который вы запускаете, щелчок по верхней панели всплывающего окна сообщения переводит ваше окно в фоновый режим.

Попробуйте это, ОЧЕНЬ надежный способ добиться этого:

namespace WindowsFormsApplication52
{
    public partial class Form1 : Form
    {
        static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
        static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
        static readonly IntPtr HWND_TOP = new IntPtr(0);
        static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
        const UInt32 SWP_NOSIZE = 0x0001;
        const UInt32 SWP_NOMOVE = 0x0002;
        const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
        }
    }
}
person Abhishek    schedule 12.09.2012

Хорошо, ребята! Спасибо за помощь, дам ответ на 0A0D так как он сработал!

Я установил TopMost = true как для события focus, так и для события unfocus для окна, и я использую .Focus() и .Show после инициализации, и все работает!

Спасибо!

person David Menard    schedule 24.06.2011
comment
Я ценю принятие, но именно вы исправили это. Я рад, что помог в любом случае. - person ; 24.06.2011