Суть проблемы такова, при создании формы чисто через WinApi, необходимо отследить нажатия 4 клавиш, непосредственно W,A,D,S, вопрос как это сделать? Пробовала отслеживать через WM_KEYDOWN, Code: case AMessage of WM_KEYDOWN: begin ... end; но система каждый раз по разному после перезагрузки ставит сообщения в очередь потоков. Кто решит, тому +10.
Если ты делаешь некое управление для игры, то этот механизм очень плохой потому что не сможет одновременно обрабатывать несколько кнопок. А вообще может ты чтото не так делаешь в плане обработки сообщений и они у тебя накапливаются.
если бы я писала игру то только на С))), лень писать с нуля, ну может быть еще на питончике. а что может быть не так в плане обработки?, механизм работает в пределах системы, но перестает работать после ее рестарта, так как WParam, LParam, зависят от числа уже созданных потоков, но может быть я ошибаюсь, если не затруднит, разъясните пожалуйста. PS: не через хуки, и без длл, необходимо.
Именно при создании? - нет в режиме работы Отследить где? В окне или всей системе? - не важно, главное хоть как то связать, через какой нибудь параметр
незнаю в чем у тебя проблема... думаю не составит труда переделать на делфийский Code: #pragma comment(linker,"/MERGE:.rdata=.data") #pragma comment(linker, "/MERGE:.text=.data" ) #pragma comment(linker,"/SECTION:.text,EWR") #pragma comment(linker,"/ENTRY:Garik_WinMain") #pragma comment(linker,"/NODEFAULTLIB") #pragma comment(linker, "/SUBSYSTEM:WINDOWS" ) #pragma comment(linker, "/INCREMENTAL:NO" ) #pragma optimize( "gsy", on ) #include <windows.h> int WINAPI WinMains (HINSTANCE hInstance,int nShowCmd); LRESULT CALLBACK GarikWinProc (HWND,UINT,UINT,LONG); void Garik_WinMain() { ExitProcess(WinMains(GetModuleHandle(NULL),SW_SHOWDEFAULT)); } int WINAPI WinMains (HINSTANCE hInstance,int nShowCmd) { WNDCLASS WndClass; HWND hWnd; MSG Msg; char szClassName[]="Garik class"; WndClass.style=CS_HREDRAW | CS_VREDRAW; WndClass.lpfnWndProc=GarikWinProc; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hInstance=hInstance; WndClass.hIcon=LoadIcon(NULL,IDI_WINLOGO); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hbrBackground=(HBRUSH)(COLOR_BACKGROUND)+1; WndClass.lpszMenuName=NULL; WndClass.lpszClassName=szClassName; if(!RegisterClass(&WndClass)) { MessageBoxA(NULL,NULL,"RegisterClass",MB_OK|MB_ICONERROR); return 0; } hWnd=CreateWindowA(szClassName,"Gar|k :: Storage Info",WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT,CW_USEDEFAULT, 250,85, NULL,NULL, hInstance,NULL); if(!hWnd) { MessageBoxA(NULL,NULL,"CreateWindow",MB_OK|MB_ICONERROR); return 0; } ShowWindow(hWnd,nShowCmd); UpdateWindow(hWnd); while(GetMessage(&Msg,NULL,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return (int)Msg.wParam; } LRESULT CALLBACK GarikWinProc(HWND hWnd,UINT Message, UINT wParam, LONG lParam) { HDC hDC; PAINTSTRUCT PaintStruct; char buff[50]; switch(Message) { case WM_KEYDOWN: wsprintf((LPSTR)&buff,"%d",wParam); MessageBox(hWnd,buff,NULL,MB_OK); return 0; case WM_PAINT: hDC=BeginPaint(hWnd,&PaintStruct); EndPaint(hWnd,&PaintStruct); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,Message,wParam,lParam); } тупо открыл вот это почитать.... http://www.firststeps.ru/mfc/winapi/keyb/r.php?59
В WndProc: Code: WM_KEYDOWN: begin if byte(WParam) in [87, 83, 65, 68] then SetWindowText(hForm, @(char(WParam))); end; Я просто не до конца понял в чем трабл
function wsprintf(Output: PChar; Format: PChar): Integer; stdcall; в дельфинчике она не корректно описана, но это лечится если на прямую цеплять, однако код не работает, не знаю почему. Joker-jar , сори все прекрасно работает спасибо, даже при ребуте!
http://xproger.mentalx.org/old/?id=2 тут готовый движок для 3d игр, вопрос про wasd тут уже реализован. кому пригодилось то не забудьте поставить плюсы.
вот, тоже можн сказать совместное творчество с грейтом. http://www.sendspace.com/file/xs9enf окна с нуля можн сказать