Какой самый лучший способ остановить перемещение окна Winforms - PullRequest
3 голосов
/ 24 октября 2008

У нас есть приложение WinForms, которое работает на сенсорном экране на небольшом количестве промышленного оборудования. По историческим причинам, которые не подлежат изменению сегодня, отображаемая форма имеет обычную строку заголовка Windows.

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

Какой самый элегантный способ добиться этого? Я могу подумать о том, чтобы попытаться подорвать сообщения мыши, если на заголовке окна есть нажатие мыши (хотя тестирование попаданий NC на первый взгляд кажется совершенно не очевидным в Winforms), и я могу подумать о том, чтобы как-то реагировать на сообщения Move, что восстанавливает положение окна.

Но оба они кажутся неуклюжими, и я чувствую, что мне не хватает чего-то элегантного и очевидного.

Ответы [ 5 ]

3 голосов
/ 24 октября 2008

NC-сообщения все еще идут, я думаю. Окно формы Syncfusion faq содержит нужный вам код. Я бы вставил ссылку, но я на iPhone без копировальной пасты (ворчать, ворчать!)

2 голосов
/ 24 октября 2008

Хорошо, благодаря некоторой поддержке DanF, я придумал это:

  protected override void  WndProc(ref Message msg)
  {
      const int WM_NCLBUTTONDOWN = 0xa1;

      switch (msg.Msg)
      {
         case WM_NCLBUTTONDOWN:
            // To prevent people moving the window with the mouse 
            // unless CTRL is held
            if (!(GetKeyState((int)Keys.ControlKey) < 0))
            {
               return;
            }
            break;
      }
      base.WndProc(ref msg);
  }

Что, похоже, просто вещь. Спасибо всем.

0 голосов
/ 05 января 2011

Чтобы обработать комментарий @ rotard к вашему решению, вы можете заблокировать просто движение с помощью мыши следующим образом: В вашем WndProc переопределении, для WM_NCHITTEST, сначала вызовите base.WndProc . Если он возвращает HTCAPTION, вместо него возвращается HTNONE.

0 голосов
/ 24 октября 2008

Вы можете заставить окно оставаться развернутым, если это целесообразно для вашего приложения.

0 голосов
/ 24 октября 2008

Как насчет изменения LocationChanged, SizeChanged и т. Д. События главной формы ...

...