Переместите Winform без полей, удерживая правую кнопку мыши, возможно, с помощью собственных методов

У меня есть ситуация, когда я хотел бы переместить форму окна, удерживая правую кнопку мыши в ее клиентской области; Форма без границ, как я уже говорил.

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

Я много чего прочитал, и этот пост выглядит полезным

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b9985b19-cab5-4fba-9dc5-f323d0d37e2f/

Я пробовал использовать это по-разному и смотрел через http://msdn.microsoft.com/en-us/library/ff468877%28v=VS.85%29.aspx, чтобы найти другие полезные вещи, и мне пришло в голову WM_NCRBUTTONDOWN, однако wndproc не обнаруживает его , может быть, потому что это обрабатывается формой?

Любое предложение приветствуется, спасибо

Франческо


person Francesco Belladonna    schedule 29.04.2011    source источник
comment
Попробуйте использовать Spy++, чтобы увидеть, какие сообщения генерируются, когда вы щелкаете левой и правой кнопкой мыши. Возможно, вы можете использовать метод по предоставленной вами ссылке и изменить его, чтобы получить желаемое поведение. Я думаю, возможно, вам нужно сообщение WM_SYSCOMMAND вместе с SC_MOVE.   -  person Chris Dunaway    schedule 29.04.2011
comment
Я попробовал сейчас, он не отслеживает мои сообщения, ничего не появляется в окне сообщений :\   -  person Francesco Belladonna    schedule 30.04.2011
comment
Не могли бы вы уточнить природу странного поведения, которое вы видите при использовании события .net MoveMove? Я сделал именно то, о чем вы говорите, с помощью MouseMove и был полностью удовлетворен результатами. (т.е. щелкните правой кнопкой мыши в области КЛИЕНТ формы и отслеживайте движение...)   -  person Jason D    schedule 06.05.2011
comment
Также: все сообщения Windows, начинающиеся с WM_NC, предназначены для НЕКЛИЕНТСКОЙ области окна (например, строки заголовка).   -  person Jason D    schedule 06.05.2011
comment
@Jason Я получил что-то вроде формы, которая не следует за мышью правильно и оставляет след, пока я не перестану перетаскивать   -  person Francesco Belladonna    schedule 06.05.2011


Ответы (2)


Для этого вам понадобятся два метода P/Invoke.

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);

[DllImport("user32.dll")]
static extern bool ReleaseCapture();

Пара констант:

const int WmNcLButtonDown = 0xA1;
const int HtCaption= 2;

Обработайте событие MouseDown в своей форме, затем сделайте следующее:

private void Form_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        ReleaseCapture();
        SendMessage(this.Handle, WmNcLButtonDown, HtCaption, 0);
    }
}

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

person Community    schedule 29.04.2011
comment
Этот метод не работает, я уже проверял его и сейчас снова проверяю. Помните, что я использую ПРАВУЮ кнопку мыши. - person Francesco Belladonna; 29.04.2011

person    schedule
comment
Это работает довольно хорошо, это не нативный метод, но выглядит хорошо. Мне пришлось удалить базовые вызовы, иначе я получу исключения stackoverflow. - person Francesco Belladonna; 07.05.2011