3

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

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

实现这一目标的最优雅方法是什么?如果标题栏上有鼠标按下,我可以考虑尝试颠覆鼠标消息(尽管乍一看,NC 命中测试在 Winforms 中似乎并不完全明显),我可以考虑以某种方式响应 Move 消息恢复窗口位置。

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

4

5 回答 5

3

Nc 消息仍然是我认为的最佳选择。Syncfusion 的 windows form faq 有你需要的代码。我会粘贴一个链接,但我在没有复制粘贴的 iPhone 上(抱怨,抱怨!)

于 2008-10-24T13:02:02.910 回答
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);
  }

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

于 2008-10-24T13:24:50.710 回答
0

修改主窗体事件的LocationChanged、SizeChanged等怎么样...

于 2008-10-24T12:53:41.943 回答
0

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

于 2008-10-24T12:56:46.070 回答
0

要处理@rotard 对您的解决方案的评论,您可以通过以下方式阻止鼠标移动:在您的覆盖WndProc中, for WM_NCHITTEST,调用base.WndProc first。如果它返回HTCAPTIONHTNONE则改为返回。

于 2011-01-04T22:01:56.720 回答