PDA

Просмотр полной версии : [Дельфинчик] Окон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.

slesh
02.06.2009, 10:56
Если ты делаешь некое управление для игры, то этот механизм очень плохой потому что не сможет одновременно обрабатывать несколько кнопок.
А вообще может ты чтото не так делаешь в плане обработки сообщений и они у тебя накапливаются.

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
Именно при создании? - нет в режиме работы
Отследить где? В окне или всей системе? - не важно, главное хоть как то связать, через какой нибудь параметр

Gar|k
02.06.2009, 11:42
незнаю в чем у тебя проблема... думаю не составит труда переделать на делфийский

#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 , сори все прекрасно работает спасибо, даже при ребуте!

Gar|k
02.06.2009, 18:20
wsprintf в моем случае это тупа inttostr )

t04
03.06.2009, 23:04
http://xproger.mentalx.org/old/?id=2
тут готовый движок для 3d игр, вопрос про wasd тут уже реализован.
кому пригодилось то не забудьте поставить плюсы.

sn0w
05.06.2009, 16:48
вот, тоже можн сказать совместное творчество с грейтом.

http://www.sendspace.com/file/xs9enf

окна с нуля можн сказать ;)