private void btnSetCursor_Click(object sender, EventArgs e) {
// 相對路徑(相對輸出目錄)或絕對路徑
this.Cursor = new Cursor("custom_cursor.cur");
}
要求:.cur 文件設置「複製到輸出目錄」→「始終複製」或「較新時複製」。
.cur 文件添加到項目,屬性「生成操作」設置為「嵌入資源」。private void SetCursorFromResource() {
string resourceName = "MyNamespace.Cursors.custom_cursor.cur"; // 默認命名空間+路徑
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
if (stream != null) {
this.Cursor = new Cursor(stream);
} else {
MessageBox.Show($"資源未找到: {resourceName}\n可用資源: {string.Join(", ", Assembly.GetExecutingAssembly().GetManifestResourceNames())}");
}
}
}
private void SetCursorFromBytes(byte[] cursorData) {
using (MemoryStream ms = new MemoryStream(cursorData)) {
this.Cursor = new Cursor(ms);
}
}
new Cursor(stream) 內部複製數據,流可立即關閉/釋放。Control.Cursor 僅影響該控件及其子控件;設置 Form.Cursor 影響整個窗體客戶區。public partial class DemoForm : Form {
private Cursor _customCursor;
private Cursor _defaultCursor;
public DemoForm() {
InitializeComponent();
_defaultCursor = this.Cursor;
// 假設 custom.cur 為嵌入資源
_customCursor = LoadCursorFromResource("MyApp.Cursors.custom.cur");
}
private Cursor LoadCursorFromResource(string name) {
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name)) {
return stream != null ? new Cursor(stream) : Cursors.Arrow;
}
}
private void btnSpecial_MouseEnter(object sender, EventArgs e) {
btnSpecial.Cursor = _customCursor;
}
private void btnSpecial_MouseLeave(object sender, EventArgs e) {
btnSpecial.Cursor = _defaultCursor;
}
protected override void OnFormClosing(FormClosingEventArgs e) {
_customCursor?.Dispose(); // 釋放非托管資源
base.OnFormClosing(e);
}
}