Всем привет. Народ, помогите с кодом выбора хоткея для трейнера. То есть, в трейнере есть конкретный хоткей (например Y), который изменяет в памяти игры какие-то данные. Хочется сделать выбор этой самой клавиши. То есть, чтобы каждый игрок выбирал этот хоткей под себя. Чтобы выглядело примерно так Использую Game Trainer Studio. Вот сохраненный им работающий пример исходника: ; #########################################################################;; This Is My Trainer Template Created For The Game Trainer Studio (Xeta);; This Is Based On A MASM Example.;; ######################################################################### .386 .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include trainer.inc ; local includes for this file; #########################################################################.data; ### Constants Below; ### Constants Above; ### Bytes BelowHotKey00000 db 001h db 001h db 001h; ### Bytes Above; ### Button Messages Below; ### Button Messages Above WindCap db "Skype™",0 szDisplayName db 'Trainer-1',0.codestart: invoke GetModuleHandle, NULL mov hInstance, eax invoke GetCommandLine mov CommandLine, eax invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax; #########################################################################WinMain proc hInst :DWORD, hPrevInst :DWORD, CmdLine :DWORD, CmdShow :DWORD ;==================== ; Put LOCALs on stack ;==================== LOCAL wc :WNDCLASSEX LOCAL msg :MSG LOCAL Wwd :DWORD LOCAL Wht :DWORD LOCAL Wtx :DWORD LOCAL Wty :DWORD ;================================================== ; Fill WNDCLASSEX structure with required variables ;================================================== invoke LoadIcon,hInst,500 ; icon ID mov hIcon, eax szText szClassName,"Trainer_Class" mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW \ or CS_BYTEALIGNWINDOW mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInst mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset szClassName m2m wc.hIcon, hIcon invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor, eax m2m wc.hIconSm, hIcon invoke RegisterClassEx, ADDR wc ;================================ ; Centre window at following size ;================================ mov Wwd, 325 ; Dialog Width mov Wht, 214 ; Dialog Height invoke GetSystemMetrics,SM_CXSCREEN invoke TopXY,Wwd,eax mov Wtx, eax invoke GetSystemMetrics,SM_CYSCREEN invoke TopXY,Wht,eax mov Wty, eax invoke CreateWindowEx,WS_EX_LEFT, ADDR szClassName, ADDR szDisplayName, WS_MINIMIZEBOX or WS_OVERLAPPED or WS_SYSMENU, Wtx,Wty,Wwd,Wht, NULL,NULL, hInst,NULL mov hWnd,eax invoke ShowWindow,hWnd,SW_SHOWNORMAL invoke UpdateWindow,hWnd ;=================================== ; Loop until PostQuitMessage is sent ;=================================== StartLoop: invoke GetMessage,ADDR msg,NULL,0,0 cmp eax, 0 je ExitLoop invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg jmp StartLoop ExitLoop: return msg.wParamWinMain endp; #########################################################################WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD LOCAL var :DWORD LOCAL caW :DWORD LOCAL caH :DWORD LOCAL color :DWORD LOCAL hDC :DWORD LOCAL Rct :RECT LOCAL Ps :PAINTSTRUCT LOCAL buffer1[128]:BYTE LOCAL buffer2[128]:BYTE LOCAL lfnt :LOGFONT LOCAL psd :PAGESETUPDLG LOCAL pd :PRINTDLG LOCAL RectB :RECT .if uMsg == WM_COMMAND MOV EAX, wParam .if wParam == 499 .elseif wParam == 500 ButtonJump_Jump500:Invoke ExitProcess, 0 .endif .elseif uMsg == WM_CTLCOLORSTATIC JMP @WM_CTLCOLOREDIT .elseif uMsg == WM_CTLCOLOREDIT @WM_CTLCOLOREDIT: .elseif uMsg == WM_DRAWITEM .elseif uMsg == WM_CREATE Invoke Protection MOV HotKeyMiniToggle, TRUE szText font1,'MS Sans Serif' invoke CreateFont,8,5,0,0,500,0,0,0, \ DEFAULT_CHARSET,0,0,0,\ DEFAULT_PITCH,ADDR font1 mov hFont, eax Invoke SetTimer, hWin, 1, 100, 0 ; HotKey Timer Invoke SetTimer, hWin, 2, 300, 0 ; EditBox Timer 1 Invoke SetTimer, hWin, 3, 300, 0 ; EditBox Timer 2 Invoke SetTimer, hWin, 4, 100, 0 ; EditBox Freeze Timer szText bTxt1,"Close" invoke PushButton,ADDR bTxt1,hWin,120,136,94,28,500 .elseif uMsg == WM_TIMER Invoke Protection .If wParam == 1 ; ### Timer Below ###Invoke GetKeyState, VK_Ymov HotBuffer1, eax .if HotBuffer1 > 1Invoke TrainerEngine, NULL, Offset WindCap, 000CCFF8h, Offset HotKey00000, 3.endif .Endif ; ### Timer Above ### .If wParam == 2 ; ### Timer Below ### .Endif ; ### Timer Above ### .If wParam == 3 ; ### Timer Below ### .Endif ; ### Timer Above ### .If wParam == 4 ; ### EBFreeze Timer Below ### .Endif ; ### EBFreeze Timer Above ### .elseif uMsg == WM_HOTKEY .elseif uMsg == WM_PAINT invoke BeginPaint,hWin,ADDR Ps mov hDC, eax invoke Paint_Proc,hWin,hDC invoke EndPaint,hWin,ADDR Ps return 0 .elseif uMsg == WM_DESTROY invoke PostQuitMessage,NULL return 0 .endif invoke DefWindowProc,hWin,uMsg,wParam,lParam retWndProc endp; ########################################################################TopXY proc wDim:DWORD, sDim:DWORD shr sDim, 1 ; divide screen dimension by 2 shr wDim, 1 ; divide window dimension by 2 mov eax, wDim ; copy window dimension into eax sub sDim, eax ; sub half win dimension from half screen dimension return sDimTopXY endp; #########################################################################Paint_Proc proc hWin:DWORD, hDC:DWORD LOCAL btn_hi :DWORD LOCAL btn_lo :DWORD LOCAL Rct :RECT invoke GetSysColor,COLOR_BTNHIGHLIGHT mov btn_hi, eax invoke GetSysColor,COLOR_BTNSHADOW mov btn_lo, eax return 0Paint_Proc endp; ########################################################################OnDrawItem proc uses ebx idCtl:DWORD,pdis:DWORD,pcol:DWORD,pbkcol:DWORDLOCAL tbuff[20h]:byte mov ebx,pdis assume ebx:ptr DRAWITEMSTRUCT .if [ebx].CtlType == ODT_BUTTON .if pbkcol == 0 .else invoke SetBkMode,[ebx].hdc,OPAQUE Invoke SetBkColor,[ebx].hdc,pbkcol Invoke CreateSolidBrush, pbkcol invoke FillRect,[ebx].hdc,addr [ebx].rcItem,eax .endif invoke SetTextColor,[ebx].hdc,pcol .if ([ebx].itemState & ODS_SELECTED) invoke DrawEdge,[ebx].hdc,addr [ebx].rcItem,BDR_SUNKEN,BF_RECT invoke OffsetRect,addr [ebx].rcItem,1,1 .else invoke DrawEdge,[ebx].hdc,addr [ebx].rcItem,EDGE_RAISED,BF_RECT .endif invoke GetWindowText,[ebx].hwndItem,addr tbuff,sizeof tbuff lea edx,[ebx].rcItem lea ecx,tbuff invoke DrawText,[ebx].hdc,ecx,eax,edx,DT_CENTER or DT_VCENTER or DT_SINGLELINE or DT_NOCLIP .if [ebx].itemState & ODS_FOCUS invoke InflateRect,addr [ebx].rcItem,-4,-4 invoke DrawFocusRect,[ebx].hdc,addr [ebx].rcItem .endif .endif assume ebx:nothing retOnDrawItem endp; ########################################################################end start