Jump to content
Korean Random

PinkElfant

User
  • Posts

    422
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by PinkElfant

  1. Edited by cep62rus

    'Работа с окном'

    #include <iostream>
    #include <Windows.h>
    #include <math.h>
    
    using namespace std;
    
    //MAKELONG MACRO
    #define MAKELONG(a, b)      ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))
    
    int main()
    {
    	setlocale(0, "russian");
    
    	HWND hWnd = (HWND)0x000203EC;
    
    	///Отправка на перемещение и нажатие кнопки мыши, потом запрос на отрисовку
    	/*SendMessage(hWnd, WM_MOUSEMOVE, 0, MAKELONG (300, 300));
    	SendMessage(hWnd, WM_LBUTTONDOWN, 0, MAKELONG (300, 300));
    	SendMessage(hWnd, WM_LBUTTONUP, 0, MAKELONG (300, 300));
    	SendMessage(hWnd, WM_PAINT, 0, 0);*/
    
    	//А теперь прикол =) //рисует в паинте график cos
    	int x, y;
    	SendMessage(hWnd, WM_LBUTTONDOWN, 0, MAKELONG (100, 300));
    	for(int i = 100; i < 500; i++)
    	{
    		x = i;
    		y = 300 + cos((float)x/4)*70; // cos(х/a) /чем больше, тем функция в длинну растягивается
    		SendMessage(hWnd, WM_MOUSEMOVE, 0, MAKELONG (x, y));
    		Sleep(50);//Задержка
    	}
    	SendMessage(hWnd, WM_LBUTTONUP, 0, MAKELONG (x, y));
    	SendMessage(hWnd, WM_PAINT, 0, 0);
    
    	cout << "Готово!" << endl;
    
    	system("pause");
    	return 0;
    }
    

    'Работа с джоем'

    #pragma comment (linker, "/ENTRY:mainCRTStartup")
    
    #include <SDL.h>
    #include <iostream>
    #include <Windows.h>
    
    #pragma comment(lib, "SDL2.lib")
    #pragma comment(lib, "SDL2main.lib")
    using namespace std;
    
    #undef main
     
    int main()
    {
        // Переменная для нашего джойстика
        SDL_Joystick *joy;   
        SDL_Event event;
     
        // Инициализация SDL для использования джойстика, включение событий от джойстика и его открытие
        SDL_Init(SDL_INIT_JOYSTICK);
        SDL_JoystickEventState(SDL_ENABLE);
        joy = SDL_JoystickOpen(0);
     
       while(1)
       {
    		Sleep(10);//Задержка, разгрузка процессора
    
    		SDL_PollEvent(&event);
    
    		static int mouse_boost = 0;
    
    		if(SDL_JoystickGetButton(joy, 5))
    			mouse_boost = 2;
    		else
    			mouse_boost = 1;
    
    		//Значения по осям от -32768 до 32767.
    		//Ось 1. Y инвертирована
    		int xAxis1 = SDL_JoystickGetAxis(joy, 0);
    		int yAxis1 = -SDL_JoystickGetAxis(joy, 1);
    
    		//Передвижение мыши с помощью Оси 1
    		float speed_coef = 0.5;//коэфициент замедления скорости
    		if((xAxis1 != 0) || (yAxis1 != 0))
    		{
    			POINT mouseCoord;
    			GetCursorPos(&mouseCoord);
    			//Иверт инвертированной оси -yAxis1, т.к. экран с лев. верх. угла. (* mouse_boost) - коэф ускорения
    			SetCursorPos(mouseCoord.x + (xAxis1 / (15000 * speed_coef)) * mouse_boost, mouseCoord.y + (-yAxis1 / (15000 * speed_coef)) * mouse_boost);
    		}
        }
    	return 0;
    }
    

    • Upvote 1
  2. Edited by cep62rus

    //Ничайно удалил свой пост выше. Интернет лаганул.

    Дело в том, что MakeLong должна быть отдельно функцией, не знаю как в AHK это делать, но выглядеть это дожно примерно так

     

     


    //функция
    MakeLong( LoWord, HiWord )
    {
    return (HiWord << 16) | (LoWord & 0xffff)
    } 
    //функция
    
    //здесь блок, если нужно перемещать
    if MouseNeedsToBeMoved
    {
    lParam := MakeLong( DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier ) // вызов
    SendMessage, 0x200, 0, %lParam%,, WoT Client
    }
    return 

    А ошибки выдает интерпритатор?

     

     

    А также необходимо передавать координаты, тоесть получить при помощи GetCursorPos координаты мыши, прибавить к ним DeltaX, DeltaY и уже перемещать.

    //offtop. Печаль, жалко ноутбук сломан, написал бы на C++ бы все, а на старом компьютере ничего не запустить

  3. Edited by cep62rus

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

     

    Я кстати эту функцию "WM_MOUSEMOVE" уже встречал, но так как обещал сыну на выходных "танчики в разделенном экране", отложил на потом изучение данного вопроса. Если получиться - это будет супер :)

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

  4. Edited by cep62rus

    Как я понимаю AHK умеет отправлять сообщения окну своей функцие SendMessage. Тоесть вызывать ее из WinApi. параметры

    SendMessageW(
        __in HWND hWnd,
        __in UINT Msg,
        __in WPARAM wParam,
        __in LPARAM lParam);

    Вообщем надо "курить" Spy++ утилиту и формировать запрос окну с нужными параметрами. Имулировать движение мыши.

    Также поискать можно Эмуляция движений мыши в неактивном окне C++ или вообще другой язык программирования. Тоесть там сводится все к вызову WinApi функции с нужными параметрами, тоесть

        __in HWND hWnd = хендл окна
        __in UINT Msg = тип сообщения(WM_MOUSEMOVE)
        __in WPARAM wParam = (не знаю, нужно капать)
        __in LPARAM lParam = (тут посмотрел при помощи Spy++ необходим парметр в котором lp = MAKELPARAM(х, у); координаты. формируется не знаю как, надо разбираться.)

     

    Извиняюсь, что так резко набрасал. Пока что нашел. Самому аж интересно, сам в танчики не играю сейчас

     

     

    //upd 23.04 09.06.2014

    http://www.vsokovikov.narod.ru/New_MSDN_API/Mouse_input/notify_wm_nchittest.htm

    http://www.vsokovikov.narod.ru/New_MSDN_API/Mouse_input/notify_wm_mousemove.htm

  5. Edited by cep62rus

    //Up

    Несовсем понятно. Можно поподробнее?

     

    Offtop.Кстати написал на C++ при использовании SDL библиотеки управление мышкой с джойстика =) Радость до ушей. Вот хочу, что нибудь еще написать, больше практиковаться и учить язык.

     

    У меня обработка клавиша нажата или нет идет в цикле. Так вот я там сделал mouse_boost переменную-коэфициент, который увеличивается если я зажму например клавишу 6 на джойстике. Также можно попробывать и на AHK скрипте. Тоесть если нажата эта клавиша, то коэф. увеличить. И мышка движется быстрее

    Вот так примерно

    while(1)
       {
    		Sleep(10);//Задержка, разгрузка процессора
    
    		SDL_PollEvent(&event);
    
    		static int mouse_boost = 0;
    
    		if(SDL_JoystickGetButton(joy, 5))
    			mouse_boost = 2;
    		else
    			mouse_boost = 1;
    
    		//Ось 1. Y инвертирована
    		int xAxis1 = SDL_JoystickGetAxis(joy, 0);
    		int yAxis1 = -SDL_JoystickGetAxis(joy, 1);
    
    		//Ось 2. Y инвертирована
    		int xAxis2 = SDL_JoystickGetAxis(joy, 4);
    		int yAxis2 = -SDL_JoystickGetAxis(joy, 2);
    
    		//Передвижение мыши с помощью Оси 1
    		float speed_coef = 0.5;//коэфициент замедления скорости
    		if((xAxis1 != 0) || (yAxis1 != 0))
    		{
    			POINT mouseCoord;
    			GetCursorPos(&mouseCoord);
    			//Иверт инвертированной оси -yAxis1, т.к. экран с лев. верх. угла. (* mouse_boost) - коэф ускорения
    			SetCursorPos(mouseCoord.x + (xAxis1 / (15000 * speed_coef)) * mouse_boost, mouseCoord.y + (-yAxis1 / (15000 * speed_coef)) * mouse_boost);
    		}
        }

    • Upvote 1
  6. Edited by cep62rus

    Народ, не откланяйтесь от темы. Называть то как играет игрок можно ,если вдуматься, по-разному(его рейтинг и пр.). И "эффективностью", и его "кпд" - это все философия. Не стоит также забывать, что существует перевод из рейтинга в 4 заначной шкале в 2 знач шкалу(от 0 до 100). Что поправу можно назвать кпд.

    По теме. Было бы не плохо. Рейтинг за 1к показывает насколько играет игрок последнюю тысячу боев. Но думаю это сложные алгоритмы и/или просто необходимо железо для обработки этой информации.

    • Downvote 2
  7. Edited by cep62rus

     

    ассемблер (для бородатых труъ программистов) и C/C++

    кроссплатформенны (кроме ассемблера).

    даже самые тру бородатые =) очень в экстренных ситуациях прибегают к ассемблеру.

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

    .

    Но здесь стоит вопрос не в том что кроссплатформенне. Даже програмируя на Delphi и не используя слишком много сторонних компонентов, а юзать функции самой ОС(в этом случае WinApi) можно сделать программу максимум компактную и не занимающую много памяти. В нынешних реалях 30мб особой роли не играют.

     

    PS./ Висит открытый FireFox 10 вкладок открыто, занимает 560 MB озу, компьюетр имеет 1.5GB. Лагов особых нет.

  8. Edited by cep62rus

     

    @DonChipato, Поковырял исходники XVM, что если попробовать так?

    msg = '<textformat tabstops="[150]"><a href="#XVM_SITE#"><font color="#E2D2A2">www.modxvm.com</font></a>\n\n</textformat>'
    type = SystemMessages.SM_TYPE.Information
    SystemMessages.pushMessage(msg, type)
    

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

  9. Edited by cep62rus

    Да, сможет. Окно танков в песочнице имеет системное имя [#] WoT Client [#], геймпады также имеют свой системный номер, для определения есть специальный скрипт.

    Отлично, что еще нужно реализовать? Я так понимаю половина уже есть? (В танки сам сейчас не играю, появилось желание выучить скриптовый язык и порешать различные задачи)

  10. Edited by cep62rus

    Выше.

    Как вариант использовать AutoIt, там можно также принимать нажатия с джоя, и запрограмировать откланения двух осей управлевния(?стиков) в движение мыши.

     

    Upd.05.06.2014 16.14

    Тот же AutoHotKey. Движение мышью(левый стик), скрол Up - Down, и клики кнопками лев., прав. - b, y соответственно

    ; 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
    

    Источник: http://autohotkey.com/docs/scripts/JoystickMouse.htm

  11. Edited by cep62rus

    Я особо не вчитывался в суть темы, но может пригодиться http://code.google.com/p/x360ce данная dll hook'ает интерфейс xinput(?world of tanks его воспринимает?), так вот, там есть ini файл в котором указывается pid устройсва(нашего джойстика), если запустить два клиента, но они буду запускаиться с разных дерикторий и со своими конф. файлам этой dll получим, что каждый джойстик подключиться к своему клиенту. Только я не проверял и не знаю, сможет ли принимать wot.

     

    Как вариант написать dll на C++ которая будет принимать при помощи DirectInput команды с джойстика и отдавать их игре через WinApi. Но я жаль нечем помочь немогу, не силен в этой области, джойстики есть, может как-нибудь да покапаюсь.

     

    Если в первом варианте я не уверен, то второй вполне возможен

×
×
  • Create New...