1

Тема: AHK: Движение курсора с ускорением

Перечитал несколько подобных тем, но адаптировать под себя никакую из них не сумел.
Хочется двигать мышкой в восьми направлениях с инфракрасного пульта, который посылает нажатие кнопок примерно каждые 200 мс, то бишь держать кнопку он не может.
Так понимаю, что после каждого нажатия нужно постепенно увеличивать шаг мышки до определённого максимального предела и далее не изменять, если нажатий не было например 400 мс то по таймеру сбрасывать шаг на начальный. Желательно при движении, небольшое увеличение размера курсора.

И ещё проблемка, управлятся это должно не горячими кнопками, а переходом по метке типа "Gosub, сдвинуть_влево_вверх" (или вызовом "функции" - если я правильно понимаю , что это такое ).

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Движение курсора с ускорением

serzh82saratov пишет:

...И ещё проблемка, управлятся это должно не горячими кнопками, а переходом по метке типа "Gosub, сдвинуть_влево_вверх" (или вызовом "функции" - если я правильно понимаю , что это такое ).

Позволь спросить, а как программа должна догадаться, по-твоему, что настала пора переходить к метке "сдвинуть_влево_вверх" ?

3

Re: AHK: Движение курсора с ускорением

Присоединюсь,  откуда информация о 200мс, о невозможность зажать клавишу?

4

Re: AHK: Движение курсора с ускорением

Позволь спросить, а как программа должна догадаться, по-твоему, что настала пора переходить к метке "сдвинуть_влево_вверх" ?

По горячей кнопке просто нужно  "Движение курсора с ускорением" вставить в другой скрипт где будет не известно, какой она будет, и Gosub, сдвинуть_влево_вверх будет прописыватся или удалятся пользователем из Gui интерфейса скрипта, одним кликом. Вообщем в етом  скрипте назначаются кнопки пользователем, и в них через интерфейс добавляются разные действия.
http://savepic.net/3356003m.jpg
отмеченное красным , это и есть гор. кнопка назначенная пользователем, правее список действий, ещё правее список назначенных действий, на ету кнопку.

Присоединюсь,  откуда информация о 200мс, о невозможность зажать клавишу?

Пульт для компьютера, держу кнопку на пульте не отпуская, посылает нажатие кнопки "1" , в открытом блокноте печатается подряд "1" на глаз где то штук 5 за секунду.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5 (изменено: serzh82saratov, 2012-09-05 15:17:45)

Re: AHK: Движение курсора с ускорением

Вот пример с громкостью, SoundVolume.level += 5 прописан для Up. А ниже сама функция. Вниз убавить громкость , вправо "муть", влево переключить режим, в режиме 2 Up открывает привод.

#NoEnv
#Persistent
#SingleInstance force
#InstallKeybdHook
#UseHook
#InstallMouseHook
Process, Close, ConfigRemaper.exe
; #ErrorStdOut           ;§¶ErrorStdOut§¶0§¶
Menu, tray, add, Настройки 
Menu, tray, add, Заблокировать 
Menu, tray, add, Перезапуск 
Menu, tray, add, Выход 
Menu, tray, NoStandard 
Menu, Tray, Icon,,, 1
/* 
<ListKey§¶>§key1§¶§key2§¶§key3§¶§key4§¶<§¶ListKey>
<ListConfig§¶>§режим1§¶§режим2§¶§режим3§¶<§¶ListConfig>
<KeyCodeList§¶>¶key1¶Up§¶key2¶Down§¶key3¶Right§¶key4¶Left§<§¶KeyCodeList>
<AlwaysOnTop§¶>-<§¶AlwaysOnTop>
<Autorun§¶>0<§¶Autorun>
<Patchbackup§¶>E:\ммм<§¶Patchbackup>
*/
;§¶StartScript§¶
b1 := ["режим1","режим2","режим3"] ;§¶Режимы
a1 := 1
Config := b1[a1]
Config := "режим1" ;§¶Стартовы駶
Return
Config:
Config := b1[a1 :=  (!a1) ||  (a1>=b1.MaxIndex()) ? 1 : a1+1]
GuiConfig:
Gui, Destroy
Gui, +AlwaysOnTop -Border +ToolWindow +HWNDguiHWND
Gui, Color, Blue
Gui, Font, s24 italic, Arial ;§¶GuiFont§¶
Gui, Add, Text, cWhite Center, %Config%
Gui, Show, NoActivate x5 y5 ;§¶GuiShow§¶
SetTimer, Destroy, 1300 ;§¶GuiSetTimer§¶
Return
Destroy:
Gui, Destroy
SetTimer, Destroy, Off
Return
$F2:: ;§Toggle§Config§
ToggleConfig:
IfWinExist, ahk_id %guiHWND%
Gosub, Config
else
Gosub, GuiConfig ;§¶GosubGuiConfig§¶
Return
;#IF Config = "G¶oba¶"
;#IF ;end§G¶oba¶§Config
;######################################### 
#IF Config = "режим1"
$Up:: ;§startkey¶key1§режим1§
SoundVolume.level += 5 ;¤¤1¤¤¶¶режим1¶¶key1¶¶Прибавить громкость¶¶
Return ;§режим1§endkey¶key1§
$Left:: ;§startkey¶key4§режим1§
Gosub, ToggleConfig ;¤¤1¤¤¶¶режим1¶¶key4¶¶Следующий режи춶
Return ;§режим1§endkey¶key4§
$Right:: ;§startkey¶key3§режим1§
SoundVolume.mute := !SoundVolume.mute ;¤¤1¤¤¶¶режим1¶¶key3¶¶Вкл.Выкл зву궶
Return ;§режим1§endkey¶key3§
$Down:: ;§startkey¶key2§режим1§
SoundVolume.level -= 5 ;¤¤1¤¤¶¶режим1¶¶key2¶¶Убавить громкость¶¶
Return ;§режим1§endkey¶key2§
#IF ;end§режим1§Config
#IF Config = "режим2"
$Up:: ;§startkey¶key1§режим2§
Gosub, OCCdRom ;¤¤1¤¤¶¶режим2¶¶key1¶¶Открыть или Закрыть лото궶
Return ;§режим2§endkey¶key1§
$Left:: ;§startkey¶key4§режим2§
Gosub, ToggleConfig ;¤¤1¤¤¶¶режим2¶¶key4¶¶Следующий режи춶
Return ;§режим2§endkey¶key4§
#IF ;end§режим2§Config
#IF Config = "режим3"
$Left:: ;§startkey¶key4§режим3§
Gosub, ToggleConfig ;¤¤1¤¤¶¶режим3¶¶key4¶¶Следующий режи춶
Return ;§режим3§endkey¶key4§
#IF ;end§режим3§Config
;§¶КОНЕЦ§¶§¶
Esc::ExitApp
Настройки:
Run %A_ScriptDir%\ConfigRemaper.ahk
ExitApp
Return
TaskSwitcher:
Send {Alt down}{Tab}                                
WinWait, ahk_class TaskSwitcherWnd, , 1.5
if ErrorLevel
return
SetTitleMatchMode Slow
WinWaitClose
Sleep, 100
Send {Alt up}
Send {Alt up}
Sleep, 200
Send {Alt up}
Send {Alt up}
Return
Перезапуск:
Reload
Return
OCCdRom:
t0 := A_TickCount
Drive, Eject
t1 := A_TickCount - t0
if t1 < 1000
Drive, Eject,, 1
Return
ShowTime:
Con = %Config%
Config = %A_Hour% : %A_Min%`r%A_DDDD%
Gosub, GuiConfig
Config = %Con%
Return
Заблокировать:
If A_IsSuspended = 0
{
Suspend
Menu, Tray, Check, Заблокировать
Con = %Config%
Config = Заблокировано
Gosub, GuiConfig
Gui, Color, Red
Config = %Con%
Return
} else
Suspend
Menu, Tray, Uncheck, Заблокировать
Con = %Config%
Config = Разблокировано
Gosub, GuiConfig
Config = %Con%
Return
Выход:
ExitApp
Class SoundVolumeControl
{
    __Set(key, value) {
        aev := this.GetAudioEndpointVolume()
        If (key = "level")
        {
            value := value > 100 ? 100 : value < 0 ? 0 : value
            DllCall(NumGet(NumGet(aev+0)+7*A_PtrSize), "ptr", aev, "float", value/100), ObjRelease(aev)
            return  
        }
        Else If (key = "mute")
        {
            DllCall(NumGet(NumGet(aev+0)+14*A_PtrSize), "ptr", aev, "int", value? 1:0, "ptr", this.VA_GUID(GuidEventContext)), ObjRelease(aev)
            return 
        }
        ELse return "", ObjRelease(aev)
    }
    __Get(key) {
        aev := this.GetAudioEndpointVolume()
        If (key = "level")
        {
            DllCall(NumGet(NumGet(aev+0)+9*A_PtrSize), "ptr", aev, "float*", vol), ObjRelease(aev)
            return this.savedLevel := Round(vol*100), this.showToolTip && this.ToolTip("Volume: " . this.savedLevel . "%")
        }
        Else If (key = "mute")
        {
            DllCall(NumGet(NumGet(aev+0)+15*A_PtrSize), "ptr", aev, "int*", muteState), ObjRelease(aev)
            return muteState
        }
        ELse return "", ObjRelease(aev)
    }
    GetAudioEndpointVolume() {
        DllCall("ole32\CoCreateInstance"
            , "ptr", this.GUID(CLSID_MMDeviceEnumerator, "{BCDE0395-E52F-467C-8E3D-C4579291692E}")
            , "ptr", 0
            , "uint", 21
            , "ptr", this.GUID(IID_IMMDeviceEnumerator, "{A95664D2-9614-4F35-A746-DE8DB63617E6}")
            , "ptr*", deviceEnumerator)
        , DllCall(NumGet(NumGet(deviceEnumerator+0)+4*A_PtrSize)
            , "ptr", deviceEnumerator
            , "uint", 0
            , "uint", 0
            , "ptr*", device)
        , ObjRelease(deviceEnumerator)
        , DllCall(NumGet(NumGet(device+0)+3*A_PtrSize)
            , "ptr", device
            , "ptr", this.GUID(iid, "{5CDF2C82-841E-4546-9722-0CF74078229A}")
            , "uint", 7
            , "uint", 0
            , "ptr*", endpointVolume)
        , ObjRelease(device)
        return endpointVolume
    }
    GUID(ByRef guid_out, guid_in) {
        VarSetCapacity(guid_out, 16, 0), DllCall("ole32\CLSIDFromString", "wstr", guid_in, "ptr", &guid_out)
        return &guid_out
    }
}
Class SoundVolume extends SoundVolumeControl
{
    static savedLevel
    static showToolTip := True
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: serzh82saratov, 2012-09-06 03:16:11)

Re: AHK: Движение курсора с ускорением

Господа, помогите пожалуйста переделать фрагмент кода глубоко уважаемого ypppu, под мои нужды.

DetectHiddenWindows, on
SetNumLockState AlwaysOn
CoordMode, Mouse, Screen
SetDefaultMouseSpeed, 0
SetMouseDelay 0
N = 5    ; коэффициент ускорения, можно менять 0-20
s = 3    ; коэффициент скорости, можно менять 1-20

vk65:: ; numpad 5 имитирует перемещение мыши вниз
vk64:: ; numpad 4 имитирует перемещение мыши влево
vk66:: ; numpad 6 имитирует перемещение мыши вправо
vk68:: ; numpad 8 имитирует перемещение мыши вверх00
While GetKeyState(A_ThisHotkey, "P") || GetKeyState(A_PriorHotkey, "P")
{
k := a_index*s*N/40
shift := N = 0 ? s : k

    if GetKeyState("vk65", "P")
    {
        if GetKeyState("vk64", "P")
            x := -shift, y := shift
        Else if GetKeyState("vk66", "P")
            x := y := shift
        Else
            x := 0, y := shift
    }
    Else if GetKeyState("vk64", "P")
    {
        if GetKeyState("vk65", "P")
            x := -shift, y := shift    
        Else if GetKeyState("vk68", "P")
            x := y := -shift
        Else
            x := -shift, y := 0
    }
    Else if GetKeyState("vk66", "P")
    {
        if GetKeyState("vk68", "P")
            x := shift, y := -shift
        Else if GetKeyState("vk62", "P")
            x := y := shift
        Else
            x := shift, y := 0
    }
    Else if GetKeyState("vk68", "P")
    {
        if GetKeyState("vk66", "P")
            x := shift, y := -shift    
        Else if GetKeyState("vk64", "P")
            x := y := -shift
        Else
            x := 0, y := -shift
    }
    MouseMove, x, y, 0, R
    Sleep, 20
}
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Движение курсора с ускорением

Задачей перемещения с ускорением решена в примере выше.
Ваши нужды заключаются в увеличении размера курсора? Угадывать ход мыслей конечно интересно, но не по формулировкам подобным используемым в сообщении #1.

8 (изменено: serzh82saratov, 2012-09-06 04:04:49)

Re: AHK: Движение курсора с ускорением

Увеличение размера курсора конечно хотелось бы, но главное не понятно как мне двигать мышь без нажатия кнопок, а наподобии  примера из поста #5
Down::SoundVolume.level -= 5
то бишь нужно так
Down::сдвинуть_вниз

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: creature.ws, 2012-09-06 04:08:45)

Re: AHK: Движение курсора с ускорением

Отлично, вы уточнили:

двигать мышь без нажатия кнопок

Т.е. по заранее заданной траектории или в заданном направлении?

Down::сдвинуть_вниз

В чём проблема? В замене Numpad5 на Down?

10

Re: AHK: Движение курсора с ускорением

В чём проблема? В замене Numpad5 на Down?

Нет.
Не знаю как ещё объснить. Ну предположим что двигать надо будет не нажатием самих кнопок , а нажатием кнопки на окне скрипта, или по какому нибудь другому условию в скрипте.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Движение курсора с ускорением

При нажатии кнопки пульта в Keyhistory скрипта что отображается? Нажатие и отпускание кнопки? Если кнопку пульта нажать и подождать N секунд в keyhistory пауза между нажатием и отпусканием зафиксируется?

12 (изменено: serzh82saratov, 2012-09-06 04:42:40)

Re: AHK: Движение курсора с ускорением

Держал кнопку "1" где то пару секунд, но не понял где пауза

31  002    a    d    8.03    1                  
31  002    a    u    0.01    1                  
31  002    a    d    0.58    1                  
31  002    a    u    0.01    1                  
31  002    a    d    0.09    1                  
31  002    a    u    0.01    1                  
31  002    a    d    0.08    1                  
31  002    a    u    0.02    1                  
31  002    a    d    0.11    1                  
31  002    a    u    0.00    1                  
31  002    a    d    0.11    1                  
31  002    a    u    0.00    1                  
31  002    a    d    0.11    1                  
31  002    a    u    0.01    1                  
31  002    a    d    0.08    1                  
31  002    a    u    0.02    1                  
31  002    a    d    0.09    1                  
31  002    a    u    0.02    1                  
31  002    a    d    0.09    1                  
31  002    a    u    0.01    1
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: creature.ws, 2012-09-07 06:30:04)

Re: AHK: Движение курсора с ускорением

numlockState := GetKeyState("Numlock", "T")
SetNumLockState AlwaysOn
OnExit, Esc
return

Esc::
    SetNumLockState, % numlockState? "On":"Off"
    ExitApp

Numpad7::MoveMousePointer("UL")
Numpad8::MoveMousePointer("U")
NumPad9::MoveMousePointer("UR")
Numpad4::MoveMousePointer("L")
Numpad6::MoveMousePointer("R")
Numpad1::MoveMousePointer("DL")
NumPad2::MoveMousePointer("D")
Numpad3::MoveMousePointer("DR")


MoveMousePointer(direction, step = 3,  acceleration = 1, maxStep = 50, timeout = 100)
{
    static priorDirection, priorStep, lastCallTime

    CoordMode, Mouse
    SetDefaultMouseSpeed, 0
    SetMouseDelay 0

    MouseGetPos, x, y

    If (direction == priorDirection && A_TickCount-lastCallTime < timeout)
        step += priorStep += acceleration
    Else priorStep := 0

    (step > maxStep) && step := maxStep

    If (direction == "U")
        y -= step
    Else If (direction == "D")
        y += step
    Else If (direction == "L")
        x -= step
    Else If (direction == "R")
        x += step
    Else If (direction == "UL")
        x -= step, y -= step
    Else If (direction == "UR")
        x += step, y -= step
    Else If (direction == "DL")
        x -= step, y += step
    Else If (direction == "DR")
        x += step, y += step

    MouseMove, x, y

    priorDirection := direction
    lastCallTime := A_TickCount
}

Без привязки к клавишам. Расценивайте как пример, а не попытку удовлетворить нужды. Переспрашивайте — прокомментирую.

14

Re: AHK: Движение курсора с ускорением

Спасибо Вам огромное, то что надо!
Супер!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui