вопрос: горячие клавиши в программе. С++

  • Автор темы woka
  • Дата начала
Статус
Закрыто для дальнейших ответов.
W

woka

#1
1. А скажите как зделать так чтобы при нажатии нескольких клавиш на клавиатуре и нажатием мыши по картинке открывалось новое окно?
2. и как зделать так чтобы в можно было при нажатии нажатии нескольких определённых клавиш вызвать меню или зделать определённое действие(яркий пример коды в играх) как бы я предпологаю как зделать это
C++:
getch()==27 //клавиша Esc
но как зделать чтобы было несколько клавиш и они выполняли какуюто функцию я не доезжаю
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Скажим форме отлавливать сообщения нажатия клавиш
C++:
Form1->KeyPreview = true
Функция обработки
C++:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
switch (Key)
{
case 27: Application->Terminate();
break;
case 13: ShowMessage("Нажали Enter");
break;
default : ShowMessage("Нажали клавишу с кодом " + IntToStr(Key));
};
}
//---------------------------------------------------------------------------
 

lazybiz

Well-known member
03.11.2010
1 339
0
#3
но как зделать чтобы было несколько клавиш и они выполняли какуюто функцию я не доезжаю
Ты имеешь в виду модификатор+(функциональная клавиша/буква) ? Или например три буквы нажать? Тут разный подход нужен...
 

lazybiz

Well-known member
03.11.2010
1 339
0
#5
Думаю тебе стоит покопать в сторону DirectInput! Сам с ним мало дел имел, поэтому на данный момент сказать ничего не могу.
Тут дело не в простой проверке пита:
C++:
if ( iKeyCode == KEY_G ) ...
Я думаю нужно использовать keyboard input buffer.
Обещаю поискать, подумать. Немного позже сообщу о результатах.

И еще. Меня вот что интересует:
при нажатии нажатии нескольких определённых клавиш вызвать меню или сделать определённое действие(яркий пример коды в играх)
Не совсем понял.. тебе их нужно одновременно нажимать или последовательно? Коды в играх вроде как последовательно вводятся..
 
W

woka

#6
Думаю тебе стоит покопать в сторону DirectInput!
на другом форуме мне сказали копать в сторону HOOKов но я не чего не на копал! посмотрим что здесь

Не совсем понял.. тебе их нужно одновременно нажимать или последовательно? Коды в играх вроде как последовательно вводятся..
без разницы! и так и так надо! скорее последовательно.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#7
Вот примерно что я имел в виду:
C++:
#define _WIN32_WINNT	0x0501
#include <windows.h>
#include <dx\dinput.h>
#include <stdio.h>

LPDIRECTINPUT8			pdi;
LPDIRECTINPUTDEVICE8	pdid_kbd;

BYTE					keystate[256];

int main( void )
{
DirectInput8Create( GetModuleHandle( NULL ), DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)&pdi, NULL );
pdi->CreateDevice( GUID_SysKeyboard, &pdid_kbd, NULL );
pdid_kbd->SetDataFormat( &c_dfDIKeyboard );
pdid_kbd->SetCooperativeLevel( NULL, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND );
pdid_kbd->Acquire();

printf( "Hit Escape to exit.\n" );
while ( 1 ) {
pdid_kbd->GetDeviceState( 256, (LPVOID)keystate );
if ( keystate[DIK_ESCAPE] & 0x80 ) break;

printf( "\t\t\t\r" );

if ( keystate[DIK_Q] & 0x80 ) printf( "Q" );
if ( keystate[DIK_W] & 0x80 ) printf( "W" );
if ( keystate[DIK_E] & 0x80 ) printf( "E" );
if ( keystate[DIK_R] & 0x80 ) printf( "R" );
if ( keystate[DIK_T] & 0x80 ) printf( "T" );
if ( keystate[DIK_Y] & 0x80 ) printf( "Y" );

fflush( stdout );

Sleep( 20 );
}
pdid_kbd->Unacquire();
pdi->Release();
return 0;
}
Думаю я не ошибусь если скажу что коды одновременно нажатых 10 клавиш ты не получишь. Я думаю это связано с контроллерами клавиатур или что-то вроде того...
 
Статус
Закрыто для дальнейших ответов.