C # Отображение формы с флагом WS_EX_NOACTIVATE - PullRequest
3 голосов
/ 04 июня 2010

У меня есть форма без полей, которая всегда находится сверху и с флагом WS_EX_NOACTIVATE, установленным для предотвращения ее фокусировки.

const int WS_EX_NOACTIVATE = 0x08000000;

protected override CreateParams CreateParams {
    get {
        CreateParams param = base.CreateParams;
        param.ExStyle |= WS_EX_NOACTIVATE;
        return param;
    }
}

Форма содержит небольшую графическую рамку для перемещения (поскольку она без полей):

private void pictureBox4_MouseMove(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        ReleaseCapture();
        SendMessage(this.Handle, 0xa1, 0x2, 0);
    }
}

Однако, когда я перемещаю окно, оно не перерисовывается / отображается, только когда я отпускаю кнопку мыши, оно перемещает форму в новое место.

Я видел приложения, которые работают аналогичным образом, но они показывают окно во время движения (например, некоторые виртуальные клавиатуры, которые я видел). Я также видел много других вопросов в сети об этой проблеме, но без ответа.

Может кто-нибудь сказать мне, возможно ли показать окно / форму, подобную этой, при движении (например, "нормальное" окно), и если да, то как это сделать?

1 Ответ

2 голосов
/ 04 июня 2010

Я думаю, что нашел решение. Я был бы очень признателен, если бы кто-нибудь мог проверить, все ли сделано правильно (никакого конфликта с сообщениями). Я изменил код выше для перемещения формы с помощью рисунка, в следующем:

[DllImportAttribute("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInstertAfter, int x, int y, int cx, int cy, uint flags);

const int SWP_NOSIZE = 0x0001;
const int SWP_NOZORDER = 0x0004;

private void pictureBox4_MouseMove(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        //ReleaseCapture();
        //SendMessage(this.Handle, 0xa1, 0x2, 0);
        SetWindowPos(Handle, IntPtr.Zero, this.Location.X + e.X,
                this.Location.Y + e.Y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
    }
}

Таким образом, в основном я удалил эти два вызова метода (функции) и переопределил их с помощью SetWindowPos (). сначала у меня были проблемы с мерцанием и неправильным позиционированием, но потом я вспомнил, чтобы проверить, являются ли координаты клиентскими или экранными координатами ...

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