Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых)

 eXeL@B —› Программирование —› Ассемблер. Код выбора хоткея.
Посл.ответ Сообщение

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 января 2015 22:57 · Поправил: Japonamat
· Личное сообщение · #1

Общий привет. Создаю трейнер для игры с помощью Game Trainer Studio. В принципе уже сделал, но возникла проблема такого характера. В трейнере есть конкретный хоткей (например Y), который изменяет в памяти игры какие-то данные, это могут быть кол-во патронов, денег и т.п. Хочется сделать выбор этой самой клавиши в трейнере. То есть, чтобы каждый игрок выбирал этот хоткей под себя. Чтобы выглядело примерно так

Проблема именно с кодом выбора хоткея. В программировании я дуб, честно сказать. Программа создает проект трейнера в своем собственном формате, но может сохранять и на Ассемблере. Вот исходник работающего образца трейнера:
Code:
  1. ; #########################################################################
  2. ;
  3. ; This Is My Trainer Template Created For The Game Trainer Studio (Xeta)
  4. ;
  5. ; This Is Based On A MASM Example.
  6. ;
  7. ; #########################################################################
  8.  
  9.    .386
  10.    .model flat, stdcall  ; 32 bit memory model
  11.    option casemap :none  ; case sensitive
  12.  
  13.    include trainer.inc   ; local includes for this file
  14. ; #########################################################################
  15.  
  16. .data
  17. ; ### Constants Below
  18.  
  19. ; ### Constants Above
  20.  
  21. ; ### Bytes Below
  22. HotKey00000 db 001h
  23.             db 001h
  24.             db 001h
  25.             db 001h
  26. ; ### Bytes Above
  27.  
  28. ; ### Button Messages Below
  29. ; ### Button Messages Above
  30.  
  31.    WindCap db "Skype™ ",0
  32.    szDisplayName db 'New Trainer',0
  33. .code
  34.  
  35. start:
  36.    invoke GetModuleHandle, NULL
  37.    mov hInstance, eax
  38.  
  39.    invoke GetCommandLine
  40.    mov CommandLine, eax
  41.  
  42.    invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
  43.    invoke ExitProcess,eax
  44.  
  45. ; #########################################################################
  46.  
  47. WinMain proc hInst     :DWORD,
  48.              hPrevInst :DWORD,
  49.              CmdLine   :DWORD,
  50.              CmdShow   :DWORD
  51.  
  52.    ;====================
  53.    ; Put LOCALs on stack
  54.    ;====================
  55.  
  56.    LOCAL wc   :WNDCLASSEX
  57.    LOCAL msg  :MSG
  58.    LOCAL Wwd  :DWORD
  59.    LOCAL Wht  :DWORD
  60.    LOCAL Wtx  :DWORD
  61.    LOCAL Wty  :DWORD
  62.  
  63.    ;==================================================
  64.    ; Fill WNDCLASSEX structure with required variables
  65.    ;==================================================
  66.  
  67.    invoke LoadIcon,hInst,500    ; icon ID
  68.    mov hIcon, eax
  69.  
  70.    szText szClassName,"Trainer_Class"
  71.  
  72.    mov wc.cbSize,         sizeof WNDCLASSEX
  73.    mov wc.style,          CS_HREDRAW or CS_VREDRAW \
  74.                 or CS_BYTEALIGNWINDOW
  75.    mov wc.lpfnWndProc,    offset WndProc
  76.    mov wc.cbClsExtra,     NULL
  77.    mov wc.cbWndExtra,     NULL
  78.    m2m wc.hInstance,      hInst
  79.    mov wc.hbrBackground,  COLOR_BTNFACE+1
  80.    mov wc.lpszMenuName,   NULL
  81.    mov wc.lpszClassName,  offset szClassName
  82.    m2m wc.hIcon,          hIcon
  83.    invoke LoadCursor,NULL,IDC_ARROW
  84.    mov wc.hCursor,        eax
  85.    m2m wc.hIconSm,        hIcon
  86.  
  87.    invoke RegisterClassEx, ADDR wc
  88.  
  89.    ;================================
  90.    ; Centre window at following size
  91.    ;================================
  92.  
  93.    mov Wwd, 320 ; Dialog Width
  94.    mov Wht, 243 ; Dialog Height
  95.  
  96.    invoke GetSystemMetrics,SM_CXSCREEN
  97.    invoke TopXY,Wwd,eax
  98.    mov Wtx, eax
  99.  
  100.    invoke GetSystemMetrics,SM_CYSCREEN
  101.    invoke TopXY,Wht,eax
  102.    mov Wty, eax
  103.  
  104.    invoke CreateWindowEx,WS_EX_LEFT,
  105.                ADDR szClassName,
  106.                ADDR szDisplayName,
  107.                WS_MINIMIZEBOX or WS_OVERLAPPED or WS_SYSMENU,
  108.                Wtx,Wty,Wwd,Wht,
  109.                NULL,NULL,
  110.                hInst,NULL
  111.    mov   hWnd,eax
  112.  
  113.    invoke ShowWindow,hWnd,SW_SHOWNORMAL
  114.    invoke UpdateWindow,hWnd
  115.  
  116.    ;===================================
  117.    ; Loop until PostQuitMessage is sent
  118.    ;===================================
  119.  
  120.    StartLoop:
  121.        invoke GetMessage,ADDR msg,NULL,0,0
  122.        cmp eax, 0
  123.        je ExitLoop
  124.        invoke TranslateMessage, ADDR msg
  125.        invoke DispatchMessage,  ADDR msg
  126.        jmp StartLoop
  127.    ExitLoop:
  128.  
  129.    return msg.wParam
  130.  
  131. WinMain endp
  132.  
  133. ; #########################################################################
  134.  
  135. WndProc proc hWin   :DWORD,
  136.              uMsg   :DWORD,
  137.              wParam :DWORD,
  138.              lParam :DWORD
  139.  
  140.     LOCAL var    :DWORD
  141.     LOCAL caW    :DWORD
  142.     LOCAL caH    :DWORD
  143.     LOCAL color  :DWORD
  144.     LOCAL hDC    :DWORD
  145.     LOCAL Rct    :RECT
  146.     LOCAL Ps     :PAINTSTRUCT
  147.     LOCAL buffer1[128]:BYTE
  148.     LOCAL buffer2[128]:BYTE
  149.     LOCAL lfnt   :LOGFONT
  150.     LOCAL psd    :PAGESETUPDLG
  151.     LOCAL pd     :PRINTDLG
  152.     LOCAL RectB     :RECT
  153.  
  154.    .if uMsg == WM_COMMAND
  155.         MOV EAX, wParam
  156.        .if wParam == 499
  157.  
  158.  
  159.        .elseif wParam == 500
  160.  
  161.        ButtonJump_Jump500:
  162. Invoke ExitProcess, 0
  163.  
  164.  
  165.        .endif
  166.    .elseif uMsg == WM_CTLCOLORSTATIC
  167.         JMP @WM_CTLCOLOREDIT
  168.    .elseif uMsg == WM_CTLCOLOREDIT
  169.         @WM_CTLCOLOREDIT:
  170.    .elseif uMsg == WM_DRAWITEM
  171.    .elseif uMsg == WM_CREATE
  172.  
  173.  
  174.         MOV HotKeyMiniToggle, TRUE
  175.         szText font1,'MS Sans Serif'
  176.         invoke CreateFont,8,5,0,0,500,0,0,0, \
  177.                           DEFAULT_CHARSET,0,0,0,\
  178.                           DEFAULT_PITCH,ADDR font1
  179.         mov hFont, eax
  180.  
  181.        Invoke SetTimer, hWin, 1, 100, 0 ; HotKey Timer
  182.        Invoke SetTimer, hWin, 2, 300, 0 ; EditBox Timer 1
  183.        Invoke SetTimer, hWin, 3, 300, 0 ; EditBox Timer 2
  184.        Invoke SetTimer, hWin, 4, 100, 0 ; EditBox Freeze Timer
  185.        szText bTxt1,"Close"
  186.        invoke PushButton,ADDR bTxt1,hWin,126,160,88,28,500
  187.  
  188.    .elseif uMsg == WM_TIMER
  189.        .If wParam == 1 ; ### Timer Below ###
  190.  
  191.  
  192. Invoke GetKeyState, VK_Y
  193. mov HotBuffer1, eax
  194.             .if HotBuffer1 > 1
  195. Invoke TrainerEngine, NULL, Offset WindCap, 0000EEEFFFh, Offset HotKey00000, 4
  196. .endif
  197.        .Endif ; ### Timer Above ###
  198.  
  199.        .If wParam == 2 ; ### Timer Below ###
  200.  
  201.        .Endif ; ### Timer Above ###
  202.  
  203.        .If wParam == 3 ; ### Timer Below ###
  204.  
  205.        .Endif ; ### Timer Above ###
  206.        .If wParam == 4 ; ### EBFreeze Timer Below ###
  207.  
  208.        .Endif ; ### EBFreeze Timer Above ###
  209.    .elseif uMsg == WM_HOTKEY
  210.    .elseif uMsg == WM_PAINT
  211.        invoke BeginPaint,hWin,ADDR Ps
  212.          mov hDC, eax
  213.          invoke Paint_Proc,hWin,hDC
  214.        invoke EndPaint,hWin,ADDR Ps
  215.        return 0
  216.    .elseif uMsg == WM_DESTROY
  217.        invoke PostQuitMessage,NULL
  218.        return 0 
  219.    .endif
  220.  
  221.     invoke DefWindowProc,hWin,uMsg,wParam,lParam
  222.  
  223.     ret
  224.  
  225. WndProc endp
  226.  
  227. ; ########################################################################
  228.  
  229. TopXY proc wDim:DWORD, sDim:DWORD
  230.  
  231.    shr sDim, 1      ; divide screen dimension by 2
  232.    shr wDim, 1      ; divide window dimension by 2
  233.    mov eax, wDim    ; copy window dimension into eax
  234.    sub sDim, eax    ; sub half win dimension from half screen dimension
  235.  
  236.    return sDim
  237.  
  238. TopXY endp
  239.  
  240. ; #########################################################################
  241.  
  242. Paint_Proc proc hWin:DWORD, hDC:DWORD
  243.  
  244.    LOCAL btn_hi   :DWORD
  245.    LOCAL btn_lo   :DWORD
  246.    LOCAL Rct      :RECT
  247.  
  248.    invoke GetSysColor,COLOR_BTNHIGHLIGHT
  249.    mov btn_hi, eax
  250.  
  251.    invoke GetSysColor,COLOR_BTNSHADOW
  252.    mov btn_lo, eax
  253.  
  254.    return 0
  255.  
  256. Paint_Proc endp
  257.  
  258. ; ########################################################################
  259.  
  260. OnDrawItem proc uses ebx idCtl:DWORD,pdis:DWORD,pcol:DWORD,pbkcol:DWORD
  261. LOCAL tbuff[20h]:byte
  262.    mov ebx,pdis
  263.    assume ebx:ptr DRAWITEMSTRUCT
  264.    .if [ebx].CtlType == ODT_BUTTON
  265.        .if pbkcol == 0
  266.        .else
  267.        invoke SetBkMode,[ebx].hdc,OPAQUE
  268.        Invoke SetBkColor,[ebx].hdc,pbkcol
  269.        Invoke CreateSolidBrush, pbkcol
  270.        invoke FillRect,[ebx].hdc,addr [ebx].rcItem,eax
  271.        .endif
  272.        invoke SetTextColor,[ebx].hdc,pcol
  273.        .if ([ebx].itemState & ODS_SELECTED)
  274.            invoke DrawEdge,[ebx].hdc,addr [ebx].rcItem,BDR_SUNKEN,BF_RECT
  275.            invoke OffsetRect,addr [ebx].rcItem,1,1
  276.        .else
  277.            invoke DrawEdge,[ebx].hdc,addr [ebx].rcItem,EDGE_RAISED,BF_RECT   
  278.        .endif
  279.        invoke GetWindowText,[ebx].hwndItem,addr tbuff,sizeof tbuff
  280.        lea edx,[ebx].rcItem
  281.        lea ecx,tbuff
  282.        invoke DrawText,[ebx].hdc,ecx,eax,edx,DT_CENTER or DT_VCENTER or DT_SINGLELINE or DT_NOCLIP
  283.        .if [ebx].itemState & ODS_FOCUS
  284.            invoke InflateRect,addr [ebx].rcItem,-4,-4
  285.            invoke DrawFocusRect,[ebx].hdc,addr [ebx].rcItem
  286.        .endif
  287.    .endif
  288.    assume ebx:nothing
  289.    ret
  290. OnDrawItem endp
  291.  
  292. ; ########################################################################
  293. end start

Или проект в собственном формате Game Trainer Studio. На случай, если кто скачает эту программку и поможет мне разобраться как мне реализовать эту фишку. Помогите добавить сюда этот чертов выбор!




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 12 января 2015 01:04 · Поправил: plutos
· Личное сообщение · #2

Japonamat пишет:
чтобы каждый игрок выбирал этот хоткей под себя.


Непонятно, зачем такие роскошные возможности, но если уж нужно,
то используйте UnregisterHotKey, RegisterHotKey, PreTranslateMessage and WM_HOTKEY message.

Т.е. сперва пусть будет какой-то default key assigned, а если не устраивает, то можно поменять на другой.

Japonamat пишет:
В программировании я дуб, честно сказать.


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

-----
Give me a HANDLE and I will move the Earth.




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 января 2015 02:20
· Личное сообщение · #3

plutos пишет:
Непонятно, зачем такие роскошные возможности

Можно и не роскошные. В принципе, мне достаточно двух клавиш - Е и Q. Остальные, если понадобятся, сам допишу по аналогии. Я парень сообразительный.
И, в общем, можно и чек-боксы прикрутить, а не выпадающий список. Это не принципиально.

не морочте голову ни себе, ни другим. На пальцах никто ничего не обьяснит и дописывать за вас не станет.
Что-то мне говорит о том, что весь нужный мне код объемом будет не больше вашего поста. И для знающего человека написание его займет максимум пять минут.
И стоило подходить только для того, чтобы сказать - я тебе помогать не буду?
Я в подобной ситуации помогу, если знаю, и если есть время. Почему бы не предположить, что я не уникальный в своем роде?




Ранг: 104.9 (ветеран), 47thx
Активность: 0.040.02
Статус: Участник

Создано: 12 января 2015 02:49
· Личное сообщение · #4

msctls_hotkey32 же.



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 января 2015 02:52
· Личное сообщение · #5

ManHunter пишет:
msctls_hotkey32 же.

Мне это ни о чем не говорит. Я же честно написал - в программировании я дуб.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 12 января 2015 03:05 · Поправил: plutos
· Личное сообщение · #6

Japonamat пишет:
И стоило подходить только для того, чтобы сказать - я тебе помогать не буду?

Japonamat пишет:
Я парень сообразительный.


Того, что я вам дал, должно вполне хватить человеку сообразительному.
По крайней мере, можно поискать code samples, используя названия функций, которые я вам дал.
Поисk в google занял бы меньше времени, чем писание обиженых постов.

-----
Give me a HANDLE and I will move the Earth.




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 января 2015 04:31
· Личное сообщение · #7

plutos пишет:
Поисk в google занял бы меньше времени, чем писание обиженых постов.

Это пока самый ценный из всех ваших советов. Спасибо, больше мне помогать не надо.




Ранг: 104.9 (ветеран), 47thx
Активность: 0.040.02
Статус: Участник

Создано: 12 января 2015 09:18
· Личное сообщение · #8

Japonamat пишет:
Мне это ни о чем не говорит. Я же честно написал - в программировании я дуб.

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 12 января 2015 10:15
· Личное сообщение · #9

Code:
  1. Invoke GetKeyState, VK_Y
  2. mov HotBuffer1, eax
  3.             .if HotBuffer1 > 1
  4. Invoke TrainerEngine, NULL, Offset WindCap, 0000EEEFFFh, Offset HotKey00000, 4


Так вот же оно. Читает состояние клавиши, если нажата, то дёргается TrainerEngine. Надо менять VK_Y на другую, и будет счастье.

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: Japonamat

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 января 2015 19:08
· Личное сообщение · #10

ARCHANGEL пишет:
Так вот же оно. Читает состояние клавиши, если нажата, то дёргается TrainerEngine. Надо менять VK_Y на другую, и будет счастье.

Да это понятно. Я без проблем могу создать трейнер с хоткеем на любую клавишу. Мне хочется чтобы в самом трейнере был выбор удобного хоткея. Типа выпадающего списка или чек-бокса. Чтобы запустил трейнер - выбрал удобный для себя хоткей и играешь.




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 12 января 2015 20:09
· Личное сообщение · #11

Japonamat пишет:
Чтобы запустил трейнер - выбрал удобный для себя хоткей и играешь.


Register/UnregisterHotKey имхо ваш случай ) дорога на мсдн и реф ссылки в ём же вам в помощь



Ранг: 95.1 (постоянный), 247thx
Активность: 0.260.01
Статус: Участник

Создано: 12 января 2015 20:15
· Личное сообщение · #12

Japonamat пишет:
Да это понятно. Я без проблем могу создать трейнер с хоткеем на любую клавишу. Мне хочется чтобы в самом трейнере был выбор удобного хоткея. Типа выпадающего списка или чек-бокса. Чтобы запустил трейнер - выбрал удобный для себя хоткей и играешь.

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

-----
TEST YOUR MIGHT





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 12 января 2015 20:41
· Личное сообщение · #13

Rainbow пишет:
Register/UnregisterHotKey имхо ваш случай ) дорога на мсдн и реф ссылки в ём же вам в помощь


Ему это уже говорили, гляньте в мой пост выше (номер 2).
Это "Сделай за меня" случай.

-----
Give me a HANDLE and I will move the Earth.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 января 2015 22:00
· Личное сообщение · #14

Топик ни о чём, своей работы 0. С таким подходом только в поиск специалистов. Закрыто.


 eXeL@B —› Программирование —› Ассемблер. Код выбора хоткея.
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати