2017-01-18 4 views
5

Я пытаюсь изменить окно курсоров (по умолчанию для Windows Пользовательских Scheme) для моих пользовательских курсоров (его называли Разрежьте веревку):Программно изменить пользовательский курсор мыши в окнах?

enter image description here

Есть ли идея изменить все курсоры (Стрелка , Занят, Выбор справки, Выбор ссылок, ...), чтобы вырезать веревку? Пожалуйста, помогите, спасибо!

ответ

2

Если вы хотите изменить по умолчанию курсор мыши тему в:

enter image description here

Вы можете просто изменить его в реестре:

Есть три основных ключей реестра, которые вступают в игру ,

  1. Ключ реестра HKEY_CURRENT_USER \ Control Panel \ курсоров содержит активные курсоры пользователя

    1a) Значения ниже этого являются различные типы курсоров
    1b) Источник Схема определяет тип схемы курсора который в настоящее время используется.

    Различные значения являются:

    "0" - Windows по умолчанию
    "1" - Пользователь Схема
    "2" - Схема системы

  2. ключ реестра HKEY_CURRENT_USER \ Control Panel \ Cursors содержит определенные пользователем схемы курсора (т.е. Source Source = 1)

  3. Раздел реестра HKEY_LOCAL_MACHINE \ SOFTWA RE \ Microsoft \ Windows \ CurrentVersion \ Control Panel \ Схемы содержит схемы системных курсоров (т. Схема источника = 2)

enter image description here

Если вы уже изменили путь к одному из типов курсора в HKCU \ Control Panel \ Cursors и понял, что это ничего не делать. Вы правы, просто обновляя ключ - HKCU \ Control Panel \ Cursors \ Arrow, например, недостаточно. Вы должны указать окнам, чтобы загрузить новый курсор.

Здесь приходит вызов SystemParametersInfo. Чтобы попробовать это, давайте перейдем к использованию HKCU \ Control Panel \ Cursors \ Arrow в C: \ WINDOWS \ Cursors \ appstar3.ani (предположим, что у вас есть этот значок), а затем позвоните в SystemParametersInfo.

В AutoHotkey Script:

SPI_SETCURSORS := 0x57 
result := DllCall("SystemParametersInfo", "UInt", SPI_SETCURSORS, "UInt", 0, "UInt", 0, "UInt", '0') 
MsgBox Error Level: %ErrorLevel% `nLast error: %A_LastError%`nresult: %result% 

Перевод на C#:

[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")] 
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni); 

const int SPI_SETCURSORS = 0x0057; 
const int SPIF_UPDATEINIFILE = 0x01; 
const int SPIF_SENDCHANGE = 0x02; 
SystemParametersInfo(SPI_SETCURSORS, 0, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); 

Изменение в Windows по умолчанию Курсор

Теперь сложная часть. Если вы посмотрите на HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Control Panel \ Схемы, вы заметите, что "Windows Default" определяется как ",,,,,,,,,,,,," или, другими словами, никаких указателей к фактическим курсорам!

Что теперь делать? Не волнуйся. Все, что вам нужно сделать, это установить разные типы курсоров для пустых строк, а затем сделать вызов SystemParametersInfo обычным. Фактически, вы можете установить любой тип курсора на пустую строку в любой схеме, и Windows по умолчанию будет использовать ее эквивалентно в схеме «По умолчанию Windows».

REF:

https://thebitguru.com/articles/programmatically-changing-windows-mouse-cursors/3

https://social.msdn.microsoft.com/Forums/vstudio/en-US/977e2f40-3222-4e13-90ea-4e8d0cdf289c/faq-item-how-to-change-the-systems-cursor-using-visual-cnet?forum=csharpgeneral

+0

Я попытался изменить значение, но ничего не происходит, это по-прежнему курсор по умолчанию –

+0

См. Обновление - вам нужно позвонить в SystemParametersInfo –

+0

У меня есть некоторые ошибки здесь: http://i.imgur.com/Agns2vV.png. PvParam не принял нулевое значение. Я пытаюсь изменить значение pvParam на «0», и он отлично работает. Спасибо огромное! –

1
using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.IO; 
using System.Runtime.InteropServices; 

namespace WindowsFormsApplication1 { 
    public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) { 
     Bitmap bmp = Properties.Resources.Image1; 
     bmp.MakeTransparent(Color.White); 
     IntPtr hIcon = bmp.GetHicon(); 
     Icon ico = Icon.FromHandle(hIcon); 
     Cursor cur = new Cursor(hIcon); 
     using (FileStream fs = new FileStream(@"c:\temp\test.cur", FileMode.Create, FileAccess.Write)) 
     ico.Save(fs); 
     cur.Dispose(); 
     ico.Dispose(); 
     DestroyIcon(hIcon); 

     // Test it 
     cur = new Cursor(@"c:\temp\test.cur"); 
     this.Cursor = cur; 
    } 
    [DllImport("user32.dll")] 
    extern static bool DestroyIcon(IntPtr handle); 
    } 
} 

REF: https://social.msdn.microsoft.com/Forums/windows/en-US/9ea0bf74-760f-4f40-b64c-0cf7b0a56939/save-custom-cursor?forum=winforms

+0

Спасибо за ответ, но я хочу, чтобы изменить все курсоров мыши (рука, стрелка, Busy, справки, выберите ...) не только для тока курсор –

3

Вы можете сделать так. Загрузите файл Cursor.cur для загрузки пользовательского курсора. В поле MouseLeave установите курсор по умолчанию для формы.

public static Cursor ActuallyLoadCursor(String path) 
    { 
     return new Cursor(LoadCursorFromFile(path)); 
    } 

    [DllImport("user32.dll")] 
    private static extern IntPtr LoadCursorFromFile(string fileName); 

Button btn = new Button(); 
btn.MouseLeave += Btn_MouseLeave; 
btn.Cursor = ActuallyLoadCursor("Cursor.cur"); 

private static void Btn_MouseLeave(object sender, EventArgs e) 
    { 
     this.Cursor = Cursors.Default; 
    } 
+0

Я хочу изменить все окна курсоров не только для формы. Спасибо за вашу помощь! –