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

问题描述 投票:2回答:2

这是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-有没有办法更改消息框标题栏的光标?

c# winforms
2个回答
2
投票

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

所以你可能想检查一下你没有自己重置光标。

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

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.