Просмотр полной версии : [Дельфинчик] ОконAPI
Flame of Soul
02.06.2009, 10:50
Суть проблемы такова, при создании формы чисто через WinApi, необходимо отследить нажатия 4 клавиш, непосредственно W,A,D,S, вопрос как это сделать?
Пробовала отслеживать через WM_KEYDOWN,
case AMessage of
WM_KEYDOWN: begin ... end;
но система каждый раз по разному после перезагрузки ставит сообщения в очередь потоков.
Кто решит, тому +10.
Если ты делаешь некое управление для игры, то этот механизм очень плохой потому что не сможет одновременно обрабатывать несколько кнопок.
А вообще может ты чтото не так делаешь в плане обработки сообщений и они у тебя накапливаются.
Flame of Soul
02.06.2009, 11:04
Если ты делаешь некое управление для игры, то этот механизм очень плохой потому что не сможет одновременно обрабатывать несколько кнопок.
А вообще может ты чтото не так делаешь в плане обработки сообщений и они у тебя накапливаются.
если бы я писала игру то только на С))), лень писать с нуля, ну может быть еще на питончике. а что может быть не так в плане обработки?, механизм работает в пределах системы, но перестает работать после ее рестарта, так как WParam, LParam, зависят от числа уже созданных потоков, но может быть я ошибаюсь, если не затруднит, разъясните пожалуйста.
PS: не через хуки, и без длл, необходимо.
Joker-jar
02.06.2009, 11:10
Суть проблемы такова, при создании формы чисто через WinApi, необходимо отследить нажатия 4 клавиш, непосредственно W,A,D,S, вопрос как это сделать?
Именно при создании?
Отследить где? В окне или всей системе?
Flame of Soul
02.06.2009, 11:12
Именно при создании? - нет в режиме работы
Отследить где? В окне или всей системе? - не важно, главное хоть как то связать, через какой нибудь параметр
незнаю в чем у тебя проблема... думаю не составит труда переделать на делфийский
#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_SHOW DEFAULT));
}
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
Joker-jar
02.06.2009, 11:56
В WndProc:
WM_KEYDOWN:
begin
if byte(WParam) in [87, 83, 65, 68] then
SetWindowText(hForm, @(char(WParam)));
end;
Я просто не до конца понял в чем трабл
Flame of Soul
02.06.2009, 12:25
function wsprintf(Output: PChar; Format: PChar): Integer; stdcall;
в дельфинчике она не корректно описана, но это лечится если на прямую цеплять, однако код не работает, не знаю почему.
var
szMessage: PChar;
...
...
function wsprintf( lpOut: LPSTR; lpFmt: LPCTSTR; p: Pointer): Integer; stdcall;
external 'user32.dll' name 'wsprintfA';
....
....
WM_KEYDOWN: begin
GetMem( szMessage, 256 );
wsprintf( szMessage, 'D', WParam); //Конвертация упущена
MessageBox( 0, szMessage, 'Ñîîáùåíèå', MB_OK );
end;
Joker-jar , сори все прекрасно работает спасибо, даже при ребуте!
wsprintf в моем случае это тупа inttostr )
http://xproger.mentalx.org/old/?id=2
тут готовый движок для 3d игр, вопрос про wasd тут уже реализован.
кому пригодилось то не забудьте поставить плюсы.
вот, тоже можн сказать совместное творчество с грейтом.
http://www.sendspace.com/file/xs9enf
окна с нуля можн сказать ;)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot