[Дельфинчик] ОконAPI

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Flame of Soul, 2 Jun 2009.

  1. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Суть проблемы такова, при создании формы чисто через WinApi, необходимо отследить нажатия 4 клавиш, непосредственно W,A,D,S, вопрос как это сделать?

    Пробовала отслеживать через WM_KEYDOWN,
    Code:
    case AMessage of
              WM_KEYDOWN: begin ... end;
    но система каждый раз по разному после перезагрузки ставит сообщения в очередь потоков.

    Кто решит, тому +10.
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Если ты делаешь некое управление для игры, то этот механизм очень плохой потому что не сможет одновременно обрабатывать несколько кнопок.
    А вообще может ты чтото не так делаешь в плане обработки сообщений и они у тебя накапливаются.
     
  3. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    если бы я писала игру то только на С))), лень писать с нуля, ну может быть еще на питончике. а что может быть не так в плане обработки?, механизм работает в пределах системы, но перестает работать после ее рестарта, так как WParam, LParam, зависят от числа уже созданных потоков, но может быть я ошибаюсь, если не затруднит, разъясните пожалуйста.

    PS: не через хуки, и без длл, необходимо.
     
  4. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Именно при создании?
    Отследить где? В окне или всей системе?
     
  5. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Именно при создании? - нет в режиме работы
    Отследить где? В окне или всей системе? - не важно, главное хоть как то связать, через какой нибудь параметр
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    незнаю в чем у тебя проблема... думаю не составит труда переделать на делфийский
    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
     
    _________________________
  7. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    В WndProc:

    Code:
        WM_KEYDOWN:
          begin
            if byte(WParam) in [87, 83, 65, 68] then
              SetWindowText(hForm, @(char(WParam)));
          end;
    Я просто не до конца понял в чем трабл
     
  8. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    function wsprintf(Output: PChar; Format: PChar): Integer; stdcall;
    в дельфинчике она не корректно описана, но это лечится если на прямую цеплять, однако код не работает, не знаю почему.
    Joker-jar , сори все прекрасно работает спасибо, даже при ребуте!
     
    #8 Flame of Soul, 2 Jun 2009
    Last edited: 2 Jun 2009
  9. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    wsprintf в моем случае это тупа inttostr )
     
    _________________________
  10. t04

    t04 Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    137
    Likes Received:
    40
    Reputations:
    8
    http://xproger.mentalx.org/old/?id=2
    тут готовый движок для 3d игр, вопрос про wasd тут уже реализован.
    кому пригодилось то не забудьте поставить плюсы.
     
  11. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    вот, тоже можн сказать совместное творчество с грейтом.

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

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