C # - окно всегда на вершине проблемы - PullRequest
0 голосов
/ 24 июня 2011

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

chackBox1.checked = true;

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

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

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

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

Спасибо

Dave

Ответы [ 3 ]

2 голосов
/ 12 сентября 2012

Настройка 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);
        }
    }
}
1 голос
/ 24 июня 2011

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

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

0 голосов
/ 24 июня 2011

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

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

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...