这是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-有没有办法更改消息框标题栏的光标?
1)我为您的问题做了一个示例应用程序,但我无法复制您的错误。在演示中,当我移动窗口时,它一直保持不变。当我离开标题区并返回时它也恢复了。
所以你可能想检查一下你没有自己重置光标。
我能想到的解决方法是拦截Control.CursorChanged事件并将光标设置在那里,有效地重置通过windows base进行的任何更改。
2)问题是当您使用ShowDialog
方法时不再启用父窗口。我尝试使用Show
而且它完美无缺。
现在这很棘手,因为你放弃了ShowDialog
方法的模态属性。如果您仍然必须这样做,那么您可以自己重新实现ShowDialog逻辑,在不将Enabled
属性设置为false
的情况下完成相同的操作。
3-有没有办法更改消息框标题栏的光标?
在.NET Framework中,MessageBox
使用native methods,因此您无法覆盖WndProc
方法。它甚至没有一个,因为没有Control
元素。另一方面,在Mono中,有一个MessageBoxForm,您可以尝试这样做,但我不能保证它会起作用。无论哪种方式,如果您因为第二个问题而要编写自己的对话逻辑,那么您就可以编写自己的消息框表单。