Подтвердить что ты не робот

Как создать "неконфигурируемую" форму на С#?

Я хочу создать форму на С#, которая не может принять фокус, т.е. когда я нажимаю кнопку в форме, фокус не украден из приложения, которое в настоящее время имеет фокус.

Для примера см. экранную клавиатуру Windows. Обратите внимание, что при нажатии кнопки фокус не берется из приложения, которое вы в настоящее время используете.

Как я могу реализовать это поведение?

Update:

Вызывает его так же просто, как переопределение свойства CreateParams и добавление WS_EX_NOACTIVATE в расширенный стиль окна. Спасибо, что указали мне в правильном направлении!

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

Если кто-то знает, как это решить, это будет оценено.

4b9b3361

Ответ 1

Чтобы отключить активацию с помощью мыши:

class NonFocusableForm : Form
{
    protected override void DefWndProc(ref Message m)
    {
        const int WM_MOUSEACTIVATE = 0x21;
        const int MA_NOACTIVATE = 0x0003;

        switch(m.Msg)
        {
            case WM_MOUSEACTIVATE:
                m.Result = (IntPtr)MA_NOACTIVATE;
                return;
        }
        base.DefWndProc(ref m);
    }
}

Показать форму без активации (единственный способ, который работал у меня в случае без полей):

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr handle, int flags);

    NativeMethods.ShowWindow(form.Handle, 8);

Стандартный способ сделать это (похоже, что он не работает для всех стилей формы):

    protected override bool ShowWithoutActivation
    {
        get { return true; }
    }

Если есть другие способы активации формы, они могут быть подавлены аналогичным образом.