Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Управление курсорам мыши


Автор: Kirill89 28.1.2007, 22:21
В windows в настройках есть параметр скорость курсора мыши, как узнать его текущее состояние и как его поменять?

Автор: Akina 29.1.2007, 10:49
Вычитать или изменить через WMI. Читай описание Win32_ классов...

Простого способа нет.

Автор: Kirill89 30.1.2007, 15:15
Цитата(Akina @ 29.1.2007,  10:49)
Вычитать или изменить через WMI. Читай описание Win32_ классов...

Простого способа нет.

Предположим, возможно можно написать свой алгоритм, который замедлит мышь? Если есть идеи по этому поводу... Мне так даже лучше)
А вот если других, более лёгких, вариантов нет:
ЧТо такое WML? Как с этим работать? Где взять описание Win32_ классов?

Автор: Кирилл 30.1.2007, 16:01
 smile Есть идея:
1) На MousMove повесить перемещение объекта, который будет заменять курсор
2) При приближении реального курсора к границе экрана, кидать его в центр
Конечно реальный курсор лучше убрать.

Автор: Kirill89 30.1.2007, 22:48
Цитата(Кирилл @ 30.1.2007,  16:01)
smile Есть идея:
1) На MousMove повесить перемещение объекта, который будет заменять курсор
2) При приближении реального курсора к границе экрана, кидать его в центр
Конечно реальный курсор лучше убрать.

Да, идея неплохая, но "лже курсор" не будет работать с windows - приложениями...
Мне всё-же хотелость бы примера, как работать со стандартными средствами...

Автор: Akina 31.1.2007, 10:07
WMI == Windows Management Instrumentation - офигенный раздел в MSDN.

К счастью, поиск рулит. Особенно если либа поставлена локально.

Автор: Kirill89 31.1.2007, 11:15
Цитата(Akina @  31.1.2007,  10:07 Найти цитируемый пост)
Особенно если либа поставлена локально.

Ага, я этим похвастаться не могу...  smile 

Ладно, я тогда думать буду, пожалуйста, если у кого будут идеи, пишите! Мне очень нужна эта опция! Напоминаю, вопрос был в том, как через средства windows замедлить скорость передвижения курсора по экрану.
Заранее благодарю.

Автор: Kirill89 2.2.2007, 21:21
Я везде искал ответ, и ..... увы ничего...
У меня появилась бредовая идея, подскажите, это реально осуществить:
Сделать вставку на ассемблере которая меняет параметр дравера мыши в оперативной памяти  smile 
Звучит жудковато...  smile 

Автор: bom 2.2.2007, 22:32
Копай АПИ SystemParametersInfo
http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&article=2454&spider_enabled= код на С++
Там чувствительность и есть скорость. Значение (от1 до 20) хранится в строке MouseSensitivity, HKEY_CURRENT_USER\Control Panel\Mouse.
Можно поменять параметр в реестре, но для применения необходима перезагрузка Винды. Поэтому лучше через SystemParametersInfo.

ЗЫ. Не забудь показать код VB, когда решишь задачу, ибо интересно  smile 

Автор: Kirill89 2.2.2007, 23:09
Большое спасибо! Мне на С++ тоже должен подойти... Попробую тогда работать через параметр, отсылаемый программе на С, которая устанавливает этот параметр в качастве скорости мыши.
Буду надеятся, что получится.
Конечно было-бы проще сделать вставку C++ в VB. Есть такая возможность?
В кончном итоге переписать код на С в код на VB сложновато, но я попытаюсь...
Кто может что-либо предложить, буду только рад.  smile 

Автор: Kirill89 9.2.2007, 00:53
Так, народ, этот код на С++ непашет вообще! я его перелопатил в доль и поперёк!  smile  что делать!? как скорость поменять?! ведь при работе windows скорость меняется сразу после передвижения переключателя скорости, значит всё-таки можно?!  smile 

Автор: Akina 9.2.2007, 15:36
bom прав:

Цитата(MSDN)
An application uses a MOUSEKEYS structure when calling the SystemParametersInfo function with the uiAction parameter set to the SPI_GETMOUSEKEYS or SPI_SETMOUSEKEYS value.


Или поищи в MSDN в Technical Articles статью "Programming Mouse and Keyboard with DirectInput 3.0"

Автор: Kirill89 9.2.2007, 22:42
Да, bom действительно прав, но только почему код на С++ не работает?! Я его ещё немного пошерстил, пишет скорость =1 потом указываю новое значение пишет скорость = , ну скажем , 10... только ничего не меняется...

Автор: Kirill89 9.2.2007, 23:33
Хорошо, у меня есть ещё идея: можно через реестор, а потом его обновить. Я слышал, что как-то можно через rundl32 обновить (через параметр)... никто незнает как?

Автор: Kirill89 11.2.2007, 02:02
Всё! Получилось! Всем, кто помогал - большое спасибо!
Публикую что и как:
Модуль:
Код

Public Declare Function SystemParametersInfo Lib "user32" Alias _
    "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, _
    ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long

Для чтения текущего значения скорости:
Код

Dim Speed As Long
SystemParametersInfo 112, 0, Speed, 0
Print "Speed = " & Speed

Для установки нового значения скорости:
Код

Dim Speed As Long
Speed = t.Text ' новое значение
SystemParametersInfo 113, 0, ByVal Speed, 0 '112 - get ' 113 - set
Print "New speed = " & Speed

Автор: bom 11.2.2007, 11:12
Это + smile 
Поздравляю!
Код на С++ действительно не рабочий, там константа SPI_SETMOUSE (4) не правильная.

Добавлено @ 11:25 
Вернее она правильная, только для изменения MouseSpeed, MouseThreshold1, MouseThreshold2, но не для MouseSensitivity (которая и отвечает за скорость).

Да, еще надо константу SPIF_UPDATEINIFILE добавить, иначе реестр не обновится и после перезагрузки Винды скорость вернется к предыдущему значению.
Код

Const SPIF_UPDATEINIFILE = &H1

Sub changemousespeed(mspeed As Long)
SystemParametersInfo 113, 0, ByVal mspeed, SPIF_UPDATEINIFILE
End Sub

Автор: Kirill89 11.2.2007, 18:33
Предлагаю добавить это всё в faq, и подправить faq C++.  smile 

Автор: cardinal 11.2.2007, 22:55
Как будет готово - скажите. Я добавлю в FAQ по VB.

Автор: Kirill89 12.2.2007, 03:18
Цитата(cardinal @  11.2.2007,  22:55 Найти цитируемый пост)
Как будет готово - скажите. Я добавлю в FAQ по VB. 

Так вроде всё готово. Надо как-то оформить по faq'овски?

Автор: cardinal 12.2.2007, 03:20
Ага. В принципе также, как и другие темы там оформлены... Чтобы было в одном сообщении видно, что поместить в FAQ (я ведь не могу во все темы углубляться). Спасибо!

Автор: Kirill89 12.2.2007, 20:28
Для изменения скорости курсора мыши или получения её текущего значения
1) Модуль:
Код

Public Declare Function SystemParametersInfo Lib "user32" Alias _
    "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, _
    ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Public Const SPI_SETMOUSESPEED = 113
Public Const SPI_GETMOUSESPEED = 112
Public Const SPIF_UPDATEINIFILE = &H1

2) Для получения текущего значения скорости курсора:
Код

Dim MSpeed As Long
SystemParametersInfo SPI_GETMOUSESPEED, 0, MSpeed, 0 'значение скорости передаётся в переменную MSpeed
Print "Mouse speed = " & MSpeed ' выводим значение переменной на форму.

3) Для установки нового значения скорости курсора:
Код

Dim Speed As Long
Speed = SpeedTextBox.Text ' в текстовое поле SpeedTextBox вводится новое значение скорости
SystemParametersInfo SPI_SETMOUSESPEED, 0, ByVal Speed, SPIF_UPDATEINIFILE 'SPIF_UPDATEINIFILE - необходимо для обновления значения в реестре.

Автор: cardinal 13.2.2007, 02:52
http://vingrad.ru/VB-VB-003091
http://vingrad.ru/VB-VB-003092
http://vingrad.ru/VB-VB-003093

Kirill89 +

Автор: Kirill89 13.2.2007, 04:31
Всем большое спасибо!  smile 
Вопрос решен!

Автор: cardinal 13.2.2007, 04:38
Ну типа того. smile

Да спасибо забыл сказать. smile

Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)