什么是阻止Winforms窗口移动的最佳方法

时间:2008-10-24 12:50:26

标签: .net winforms desktop-application

我们有一个WinForms应用程序,它可以在一些工业设备上的触摸屏上运行。由于今天无法更改的历史原因,显示的表单具有正常的Windows标题栏。

我们希望通过拖动标题栏来阻止人们使用鼠标(即触摸屏)移动窗口。我们不关心是否有其他方法可以使用键盘移动窗口。

实现这一目标最优雅的方法是什么?如果标题栏上有鼠标按下,我可以想到试图破坏鼠标消息(尽管NC命中测试在Winforms中看起来并不是很明显),我可以想到以某种方式响应Move消息恢复窗口位置。

但这两个看起来都很笨拙,我觉得我错过了一些优雅而明显的东西。

5 个答案:

答案 0 :(得分:3)

Nc消息仍然是我想的。 Syncfusion的windows form faq具有您需要的代码。我会粘贴一个链接,但我在没有复制粘贴的iPhone上(发牢骚,发牢骚!)

答案 1 :(得分:2)

好的,感谢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);
  }

这似乎只是事情。谢谢大家。

答案 2 :(得分:0)

如何修改主窗体事件的LocationChanged,SizeChanged等...

答案 3 :(得分:0)

如果这对您的应用程序很实用,您可以强制窗口保持最大化。

答案 4 :(得分:0)

要处理@ rotard对您的解决方案的评论,您可以使用以下鼠标阻止 移动:在WndProc覆盖中,对于WM_NCHITTEST,请致电{{ 1}} 首先。如果它返回base.WndProc,请返回HTCAPTION