1 (изменено: serzh82saratov, 2014-05-01 12:33:48)

Тема: AHK: Работа с DirectInput

http://msdn.microsoft.com/en-us/library … s.85).aspx
Возможно ли получать сообщения от DirectInput? В первую очередь хотелось бы получать сообщения от джойстиков, например в замен http://l.autohotkey.net/docs/scripts/JoystickTest.htm такого скрипта.

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

2

Re: AHK: Работа с DirectInput

Нашёл нечто отдалённо похожее от Lexikos http://www.autohotkey.com/board/topic/3 … oller-api/.
  И его же комментарий по схожему вопросу http://www.autohotkey.com/board/topic/7 … ntry459023.

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

3 (изменено: kharlashkin, 2014-05-01 11:29:37)

Re: AHK: Работа с DirectInput

Доброе время суток!

Если тема жива, хочу у автора темы спросить - движется ли направление?

Хотя я сам нуб в программировании, а тем более в AHK, но пытаюсь решить одну проблему, и возможно мне Ваш опыт пригодится.

Я пытаюсь отправить в неактивное окно игры, использующей DirectInput, нажатия клавиш "WASD" через AHK.

w:: 
WinGet, wot, PID, WoT Client
ControlSend,, {sc11 Down}, ahk_pid %wot%
KeyWait, w
ControlSend,, {sc11 Up}, ahk_pid %wot%
Return
a:: 
WinGet, wot, PID, WoT Client
ControlSend,, {sc1E Down}, ahk_pid %wot%
KeyWait, a
ControlSend,, {sc1E Up}, ahk_pid %wot%
Return
s:: 
WinGet, wot, PID, WoT Client
ControlSend,, {sc1F Down}, ahk_pid %wot%
KeyWait, s
ControlSend,, {sc1F Up}, ahk_pid %wot%
Return
d:: 
WinGet, wot, PID, WoT Client
ControlSend,, {sc20 Down}, ahk_pid %wot%
KeyWait, d
ControlSend,, {sc20 Up}, ahk_pid %wot%
Return

Даже два раза получилось (наверное звезды были благосклонны), но никаких зависимостей я не смог понять.

4

Re: AHK: Работа с DirectInput

движется ли направление?

Не движется. Да и мой вопрос был в том, как получать действия от джойстиков, с недавних пор личная заинтересованность = 0.

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

5

Re: AHK: Работа с DirectInput

serzh82saratov пишет:

движется ли направление?

Не движется. Да и мой вопрос был в том, как получать действия от джойстиков, с недавних пор личная заинтересованность = 0.

Ну я на геймпаде тестировал вот этот скрипт:

+ открыть спойлер

JoyMouse.ahk

; Increase the following value to make the mouse cursor move faster:
JoyMultiplier = 0.30

; Decrease the following value to require less joystick displacement-from-center
; to start moving the mouse.  However, you may need to calibrate your joystick
; -- ensuring it's properly centered -- to avoid cursor drift. A perfectly tight
; and centered joystick could use a value of 1:
JoyThreshold = 3

; Change the following to true to invert the Y-axis, which causes the mouse to
; move vertically in the direction opposite the stick:
InvertYAxis := false

; Change these values to use joystick button numbers other than 1, 2, and 3 for
; the left, right, and middle mouse buttons.  Available numbers are 1 through 32.
; Use the Joystick Test Script to find out your joystick's numbers more easily.
ButtonLeft = 1
ButtonRight = 2
ButtonMiddle = 3

; If your joystick has a POV control, you can use it as a mouse wheel.  The
; following value is the number of milliseconds between turns of the wheel.
; Decrease it to have the wheel turn faster:
WheelDelay = 250

; If your system has more than one joystick, increase this value to use a joystick
; other than the first:
JoystickNumber = 1

; END OF CONFIG SECTION -- Don't change anything below this point unless you want
; to alter the basic nature of the script.

#SingleInstance

JoystickPrefix = %JoystickNumber%Joy
Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft
Hotkey, %JoystickPrefix%%ButtonRight%, ButtonRight
Hotkey, %JoystickPrefix%%ButtonMiddle%, ButtonMiddle

; Calculate the axis displacements that are needed to start moving the cursor:
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
if InvertYAxis
    YAxisMultiplier = -1
else
    YAxisMultiplier = 1

SetTimer, WatchJoystick, 10  ; Monitor the movement of the joystick.

GetKeyState, JoyInfo, %JoystickNumber%JoyInfo
IfInString, JoyInfo, P  ; Joystick has POV control, so use it as a mouse wheel.
    SetTimer, MouseWheel, %WheelDelay%

return  ; End of auto-execute section.


; The subroutines below do not use KeyWait because that would sometimes trap the
; WatchJoystick quasi-thread beneath the wait-for-button-up thread, which would
; effectively prevent mouse-dragging with the joystick.

ButtonLeft:
SetMouseDelay, -1  ; Makes movement smoother.
MouseClick, left,,, 1, 0, D  ; Hold down the left mouse button.
SetTimer, WaitForLeftButtonUp, 10
return

ButtonRight:
SetMouseDelay, -1  ; Makes movement smoother.
MouseClick, right,,, 1, 0, D  ; Hold down the right mouse button.
SetTimer, WaitForRightButtonUp, 10
return

ButtonMiddle:
SetMouseDelay, -1  ; Makes movement smoother.
MouseClick, middle,,, 1, 0, D  ; Hold down the right mouse button.
SetTimer, WaitForMiddleButtonUp, 10
return

WaitForLeftButtonUp:
if GetKeyState(JoystickPrefix . ButtonLeft)
    return  ; The button is still, down, so keep waiting.
; Otherwise, the button has been released.
SetTimer, WaitForLeftButtonUp, off
SetMouseDelay, -1  ; Makes movement smoother.
MouseClick, left,,, 1, 0, U  ; Release the mouse button.
return

WaitForRightButtonUp:
if GetKeyState(JoystickPrefix . ButtonRight)
    return  ; The button is still, down, so keep waiting.
; Otherwise, the button has been released.
SetTimer, WaitForRightButtonUp, off
MouseClick, right,,, 1, 0, U  ; Release the mouse button.
return

WaitForMiddleButtonUp:
if GetKeyState(JoystickPrefix . ButtonMiddle)
    return  ; The button is still, down, so keep waiting.
; Otherwise, the button has been released.
SetTimer, WaitForMiddleButtonUp, off
MouseClick, middle,,, 1, 0, U  ; Release the mouse button.
return

WatchJoystick:
MouseNeedsToBeMoved := false  ; Set default.
SetFormat, float, 03
GetKeyState, joyx, %JoystickNumber%JoyX
GetKeyState, joyy, %JoystickNumber%JoyY
if joyx > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyx - JoyThresholdUpper
}
else if joyx < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyx - JoyThresholdLower
}
else
    DeltaX = 0
if joyy > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyy - JoyThresholdUpper
}
else if joyy < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyy - JoyThresholdLower
}
else
    DeltaY = 0
if MouseNeedsToBeMoved
{
    SetMouseDelay, -1  ; Makes movement smoother.
    MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R
}
return

MouseWheel:
GetKeyState, JoyPOV, %JoystickNumber%JoyPOV
if JoyPOV = -1  ; No angle.
    return
if (JoyPOV > 31500 or JoyPOV < 4500)  ; Forward
    Send {WheelUp}
else if JoyPOV between 13500 and 22500  ; Back
    Send {WheelDown}
return

Для Xbox 360 геймпада работает. Могу проверить и для DirectInput геймпада, но позже - сейчас его под рукой нет.

6

Re: AHK: Работа с DirectInput

Ну я на геймпаде тестировал вот этот скрипт:

Это уже есть в шапке. Вопрос в получении сообщений, а не проверки в цикле.

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

7

Re: AHK: Работа с DirectInput

serzh82saratov пишет:

Это уже есть в шапке. Вопрос в получении сообщений, а не проверки в цикле.

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

8 (изменено: serzh82saratov, 2014-05-01 12:36:53)

Re: AHK: Работа с DirectInput

Т.е. Вы хотите говорить DirectInput приложению, что геймпад подключен и получать от приложения команды?

Нет, просто получать команды от джойстиков.

Понятно, а по моему вопросу наверное буду заводить отдельную темку.

Ну если думаете что связано только с DirectInput, то можете и тут оставить, тему переименовал.

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

9 (изменено: kharlashkin, 2014-05-01 13:09:10)

Re: AHK: Работа с DirectInput

serzh82saratov пишет:

Ну если думаете что связано только с DirectInput, то можете и тут оставить, тему переименовал.

Сделаю отступление с предысторией.
Как видно из тестового скрипта, игрой является "World of Tanks". Я исследую в настоящее время тему о SplitScreen режиме (запуск двух клиентов в режиме разделенного экрана и одновременной игре с двух аккаунтов двух человек на геймпадах на одном ТВ). Профильная тема на http://www.koreanrandom.com/forum/topic … it-screen/. Утилита AutoHotkey как нельзя ближе меня придвинула к реализации (особенно учитывая что скрипт http://forum.script-coding.com/viewtopi … 503#p82503 два раза сработал).
Почему я думаю что игра является DirectInput, для этого есть предпосылки:
1. Когда я пробовал подключить к игре Xbox 360 Chatpad первый раз (подробнее - http://forum.worldoftanks.ru/index.php? … ry23418199), показывал всё это знакомому программисту от него я услышал что скорее всего игра не использует WinAPI а использует DirectInput.
2. Когда я пробовал изменить размеры окон для игры в режиме "разделенного экрана", через стандартные WinAPI этого не получилось сделать. Только одна программа позволила это сделать - WDM, и я где-то встречал на форуме, что разработчики с целью ускорения работы своего кода использовали обход WinAPI, т.е. все берется напрямую (по моему мнению через DirectInput).
3. Вот этот скрипт для AHK, он отрабатывает странно (то что запустился два раза - это одно), я например жмакаю кнопки на клавиатуре - они не принимаются игрою, но как только я сделал окно игры активным, игра все эти нажатия принимает сразу.
4. Использование DirectX 9 игрой говорит так же о возможности использования DirectInput.
Поправьте меня если я что-то не так говорю.

10 (изменено: kharlashkin, 2014-05-01 15:57:53)

Re: AHK: Работа с DirectInput

Вроде прояснилась работа скрипта.
Запускаю скрипт, запускаю игру, захожу  ангар, выбираю танк, нажимаю "в бой!". При экране загрузки боя выхожу из окна, в бою скрипт работает в неактивном окне.
Второй бой, перезапуск скрипта, любый другие действия - скрипт не работает. Даже не так, скрипт то работает - игра не принимает нажатия.
Буду пробовать ещё, больше информации - лучше.

11 (изменено: bWRmeA, 2014-05-01 20:03:03)

Re: AHK: Работа с DirectInput

Вроде прояснилась работа скрипта.

WinGet, wot, PID, WoT Client

Определяет pid первого найденного окна с заголовком  "WoT Client". В итоге сообщения отправляются в найденное окно.

Если нужно повторять нажатия wasd в окне неактивной игры:

SetControlDelay -1 ; избавляемся от внутреннего таймаута интерпретатора 
title := "WoT Client"

#if WinActive(title) ; при каждом нажатии wasd ищем активное окно, если найденное окно имеет нужный загловок устанавливаем lastFound

~*vk57::
~*vk41::
~*vk53::
~*vk44::HotkeyProxy(NextWindow(title))

#if

HotkeyProxy(hwnd) {
    key := "{Blind}{" RegExReplace(A_ThisHotkey, "^[^\w\d]+") "}"
    ControlSend,, % key, ahk_id %hwnd%
}

NextWindow(title) {
    WinGet hwndList, List, % title
    loop % hwndList
        if (hwndList%A_Index% <> WinExist())
            return hwndList%A_Index%
}

12

Re: AHK: Работа с DirectInput

bWRmeA пишет:

Если нужно повторять нажатия wasd в окне неактивной игры:

Очень прошу прокомментировать код, [s]все таки я не волшебник[/s] я ничего пока не понимаю в написании скриптов для AutoHotkey.

13

Re: AHK: Работа с DirectInput

Специфические для ahk моменты прокомментированы. В остальном синтаксис стандартный. Все используемые команды документированы, читай справку.

14

Re: AHK: Работа с DirectInput

bWRmeA пишет:

Специфические для ahk моменты прокомментированы. В остальном синтаксис стандартный. Все используемые команды документированы, читай справку.

Огромнейшая благодарность, справку уже читаю.

15 (изменено: bWRmeA, 2014-05-01 20:21:02)

Re: AHK: Работа с DirectInput

Кстати, мультикликеры для твинководства регулярно мусолятся с 2008 года, на буржуйском форуме можно найти готовый скрипт под любую игру.
К DirectInput вопрос никаким боком, сейчас придёт модератор весь в белом и топик станет зелёным.

Справку читай английскую, русская актуальна примерно как  windows 98

16

Re: AHK: Работа с DirectInput

bWRmeA пишет:

Кстати, мультикликеры для твинководства регулярно мусолятся с 2008 года, на буржуйском форуме можно найти готовый скрипт под любую игру.
К DirectInput вопрос никаким боком, сейчас придёт модератор весь в белом и топик станет зелёным.

Справку читай английскую, русская актуальна примерно как  windows 98

1. Гугль не особо помог, хотя надо наверное и другие поисковики потеребить
2. Думал об этом, надо все таки завести свою темку, потому как много оффтопа не по теме.
3. Это я уже понял когда тест пробовал написать и геймпад проверял.

17

Re: AHK: Работа с DirectInput

bWRmeA пишет:

Если нужно повторять нажатия wasd в окне неактивной игры:

Наверное я многого не понимаю, Ваш код должен работать или его надо дополнять?

18

Re: AHK: Работа с DirectInput

Кому надо? Никому не надо. В блокноте работает, проект сдан.

19 (изменено: kharlashkin, 2014-05-02 12:19:14)

Re: AHK: Работа с DirectInput

bWRmeA пишет:

Кому надо? Никому не надо. В блокноте работает, проект сдан.

У меня не работает и в блокноте.

SetControlDelay -1 ; избавляемся от внутреннего таймаута интерпретатора 
title := "Безымянный - Блокнот"

#if WinActive(title) ; при каждом нажатии wasd ищем активное окно, если найденное окно имеет нужный загловок устанавливаем lastFound

~*vk57::
~*vk41::
~*vk53::
~*vk44::HotkeyProxy(NextWindow(title))

#if

HotkeyProxy(hwnd) {
    key := "{Blind}{" RegExReplace(A_ThisHotkey, "^[^\w\d]+") "}"
    ControlSend,, % key, ahk_id %hwnd%
}

NextWindow(title) {
    WinGet hwndList, List, % title
    loop % hwndList
        if (hwndList%A_Index% <> WinExist())
            return hwndList%A_Index%
}

Подскажите неучу Кстати WoT понимает только нажатия клавиш вот python код:

import Event
g_instance = None

class _InputHandler:
    onKeyDown = Event.Event()
    onKeyUp = Event.Event()

    def handleKeyEvent(self, event):
        if event.isKeyDown():
            self.onKeyDown(event)
        else:
            self.onKeyUp(event)


g_instance = _InputHandler()

Жду ответа в моей теме чтобы не оффтопить здесь.