代码之家  ›  专栏  ›  技术社区  ›  Will Dean

阻止WinForms窗口移动的最新方法是什么?

  •  3
  • Will Dean  · 技术社区  · 16 年前

    我们有一个WinForms应用程序,它在一些工业设备的触摸屏上运行。由于历史原因,今天不能更改,显示的窗体有一个普通的Windows标题栏。

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

    实现这一目标最优雅的方式是什么?如果在标题栏上有一个鼠标,我可以考虑尝试破坏鼠标信息(尽管在WinForms中,NC命中测试乍一看并不完全明显),我可以考虑以某种方式响应移动信息,以恢复窗口位置。

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

    5 回复  |  直到 14 年前
        1
  •  3
  •   Dan F    16 年前

    我认为NC消息仍然有效。SyncFusion的Windows窗体常见问题解答包含您需要的代码。我会粘贴链接,但我在iPhone上没有复制粘贴(咕哝,咕哝!)

        2
  •  2
  •   Will Dean    16 年前

    好吧,多亏了丹夫的一点鼓励,我想出了一个办法:

      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);
      }
    

    这似乎就是问题所在。谢谢大家。

        3
  •  0
  •   kenny    16 年前

    如何修改主窗体事件的位置Changed、SizeChanged等…

        4
  •  0
  •   Erick B    16 年前

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

        5
  •  0
  •   Roger Lipscombe    14 年前

    要处理@rotard对解决方案的评论,可以阻止 只是 用鼠标移动:在您的 WndProc 重写,用于 WM_NCHITTEST ,呼叫 base.WndProc 第一 . 如果它回来 HTCAPTION 返回 HTNONE 相反。