Как изменить курсор мыши windows

Gaoadt

Подскажите пожалуйста как програмно изменить курсор мыши windows, т.е. не только над формой ,а тот что настраивается в панели управления?
6 ответов

Gaoadt

Конечно, с помощью WinAPI. 99 процентов того, что не реализуется средствами .NET, реализуется WinAPI.Вот простейший пример. Курсор приходится менять заново только при перезагрузке компа.Но это только для более-менее стандартных курсоров, по крайней мере стандартного размера. Сделать какой-нибудь суперкрасивый, большой, анимированный курсор, будет сложнее. Вот первое, что приходит на ум: 1) спрятать имеющийся курсор с помощью ShowCursor() 2) создать многослойное окно с TopMost = true, на котором будет рисоваться этот курсор 3) "таскать" это окно за курсором при его перемещении (когда курсор прячут, координаты никуда не деваются, а большего и не нужно) 4) ну и предусмотреть восстановление курсора, когда запущена, например, какая-нибудь игра или экран блокировки, через который вызывают диспетчер задач, иначе курсор может исчезнуть вообще. Можно проверять, не оказалось ли окно курсора не поверх других, но лучше придумать более низкоуровневое решение.


Gaoadt

Конечно, с помощью WinAPI. 99 процентов того, что не реализуется средствами .NET, реализуется WinAPI.
Виндовс часто хранит настройки в реестре (подобные данной) и для смены курсора (смена настройки) в таком случае будет достаточно просто изменить параметр реестра из шарпа без использования АПИ. Но чтобы узнать этот параметр нужно хорошо реестр знать


Gaoadt

emenem97, значения реестра читаются только при запуске системы, поэтому при их изменении требуется перезапуск винды.


Gaoadt

Psilon, есть код такой на VB.NET. Сам не проверял, сразу говорю
Кликните здесь для просмотра всего текста
'Вступление изменений в реестре в силу без перезагрузки компьютера vb.net
 
Imports System.Runtime.InteropServices
 
Public Class Form1
    Const SHCNE_ASSOCCHANGED As Long = &H8000000L
    Const SHCNF_IDLIST As ******** = &H0UI
    <DllImport("shell32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Sub SHChangeNotify(ByVal wEventId As ******, ByVal uFlags As ******, ByVal dwItem1 As IntPtr, ByVal dwItem2 As IntPtr)
 
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero)
    End Sub
Если он действительно это делает на VB, тогда на шарпе есть аналогичный


Gaoadt

emenem97, а DllImport("shell32.dll" не смущает?..


Gaoadt

Всем спасибо рзобрался!