以下是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-有没有办法更改消息框标题栏的光标?
答案 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,您可以尝试这样做,但我不能保证它会起作用。无论哪种方式,如果您因为第二个问题而打算编写自己的对话逻辑,那么您就可以编写自己的消息框表单。