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

Спасибо,

Дейв

3 ответа

Решение

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

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

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

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

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);
        }
    }
}

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

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

Спасибо!

Другие вопросы по тегам