ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[Дельфинчик] ОконAPI
  #1  
Старый 02.06.2009, 10:50
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию [Дельфинчик] ОконAPI

Суть проблемы такова, при создании формы чисто через WinApi, необходимо отследить нажатия 4 клавиш, непосредственно W,A,D,S, вопрос как это сделать?

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

Кто решит, тому +10.
 
Ответить с цитированием

  #2  
Старый 02.06.2009, 10:56
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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

  #3  
Старый 02.06.2009, 11:04
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию

Цитата:
Если ты делаешь некое управление для игры, то этот механизм очень плохой потому что не сможет одновременно обрабатывать несколько кнопок.
А вообще может ты чтото не так делаешь в плане обработки сообщений и они у тебя накапливаются.
если бы я писала игру то только на С))), лень писать с нуля, ну может быть еще на питончике. а что может быть не так в плане обработки?, механизм работает в пределах системы, но перестает работать после ее рестарта, так как WParam, LParam, зависят от числа уже созданных потоков, но может быть я ошибаюсь, если не затруднит, разъясните пожалуйста.

PS: не через хуки, и без длл, необходимо.
 
Ответить с цитированием

  #4  
Старый 02.06.2009, 11:10
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Цитата:
Суть проблемы такова, при создании формы чисто через WinApi, необходимо отследить нажатия 4 клавиш, непосредственно W,A,D,S, вопрос как это сделать?
Именно при создании?
Отследить где? В окне или всей системе?
 
Ответить с цитированием

  #5  
Старый 02.06.2009, 11:12
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию

Именно при создании? - нет в режиме работы
Отследить где? В окне или всей системе? - не важно, главное хоть как то связать, через какой нибудь параметр
 
Ответить с цитированием

  #6  
Старый 02.06.2009, 11:42
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

незнаю в чем у тебя проблема... думаю не составит труда переделать на делфийский
Код:
#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  
Старый 02.06.2009, 11:56
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

В WndProc:

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

  #8  
Старый 02.06.2009, 12:25
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме:
1740746

Репутация: 435
Отправить сообщение для Flame of Soul с помощью MSN
По умолчанию

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

Последний раз редактировалось Flame of Soul; 02.06.2009 в 12:28..
 
Ответить с цитированием

  #9  
Старый 02.06.2009, 18:20
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

wsprintf в моем случае это тупа inttostr )
 
Ответить с цитированием

  #10  
Старый 03.06.2009, 23:04
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
По умолчанию

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





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ