Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Дельфинчик] ОконAPI (https://forum.antichat.xyz/showthread.php?t=123235)

Flame of Soul 02.06.2009 10:50

[Дельфинчик] ОконAPI
 
Суть проблемы такова, при создании формы чисто через 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_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

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 тут уже реализован.
кому пригодилось то не забудьте поставить плюсы.


Время: 05:30