C# - 移动时更改窗口标题中的光标

时间:2017-12-16 06:53:41

标签: c# winforms

以下是StackOverFlow中另一篇文章的代码,它将更改窗口标题中的光标:

 protected override void WndProc(ref Message m) {
        if (m.Msg == 0x20) {  // Trap WM_SETCUROR
            if ((m.LParam.ToInt32() & 0xffff) == 2) { // Trap HTCAPTION
                Cursor.Current = Cursors.Hand;
                m.Result = (IntPtr)1;  // Processed
                return;
            }
        }
        base.WndProc(ref m);
    }

来源:https://stackoverflow.com/a/6484627/4871566

但是我想解决另外三个问题:

1-移动窗口时(按住鼠标左键),光标将再次变为Windows默认值。有没有办法在移动表单窗口时将光标更改为我选择的光标?

2-当我将子表单加载为ShowDialog()时,主表单将被禁用,用户无法与其进行交互。我可以更改子表单区域中的光标,但是当光标时在子窗体区域(窗口)之外,它将是系统窗口的默认值。有没有办法在外面改变光标?

3-有没有办法更改消息框标题栏的光标?

2 个答案:

答案 0 :(得分:2)

1)我为你的问题做了一个示例应用程序,但我无法复制你的错误。在演示中,当我移动窗口时,它一直保持不变。当我离开标题区并返回时,它也会自行恢复。

所以你可能想要检查一下你是不是在某处自己重置光标。

我能想到的解决方法是拦截Control.CursorChanged事件并将光标设置在那里,有效地重置通过Windows基础所做的任何更改。

2)问题是当您使用ShowDialog方法时,不再启用父窗口。我尝试使用Show代替它,它完美无缺。

现在这很棘手,因为你放弃了ShowDialog方法的模态属性。如果您仍然必须这样做,那么您可以自己重新实现ShowDialog逻辑,在不将Enabled属性设置为false的情况下完成相同的操作。

答案 1 :(得分:0)

  

3-有没有办法更改消息框标题栏的光标?

在.NET Framework中,MessageBox使用native methods,因此您无法覆盖WndProc方法。它甚至没有,因为没有Control元素。另一方面,在Mono中,有一个MessageBoxForm,您可以尝试这样做,但我不能保证它会起作用。无论哪种方式,如果您因为第二个问题而打算编写自己的对话逻辑,那么您就可以编写自己的消息框表单。