مشاهده نسخه کامل
: تشخیص فشرده شدن کلید در محیط کنسول 2008 C++
mahdi bg
13-12-2011, 14:46
سلام
چطوری می تونم توی کنسول C++ 2008 تشخیص بدم که یک کلید فشرده شده است؟
ممنون
Black Band
13-12-2011, 18:31
نحوه ی تشخیص کلید های بالا، پایین، چپ و راست :
int c=(int)getch(),d=0;
if(c==0) d=(int)getch();
// d=72 ==> UP
// d=80 ==> DOWN
// d=77 ==> RIGHT
// d=75 ==> LEFT
برای تشخیص فشرده بودن کلید Shift :
برای داس از تابع int86 استفاده می شود. (هدر فایل dos.h) که ظاهرا در Visual Studio پشتیبانی نمی شود ( یا شاید هم طریقه استفاده تغییر کرده ).
برای ویندوز هم می توان از تابع GetKeyState از توابع API ، (هدر فایل windows.h) استفاده کرد.
در مورد کلید های جهت نما و کدهای Ascii آنها در تاپیک زیر توضیحات کاملی را پیدا خواهید کرد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نمونه برنامه در Turbo C++ 3.0 :
#include <iostream.h>
#include <dos.h>
#include <conio.h>
int get_state();
int isLShiftDown();
void main()
{
int ch = 0;
while(ch != 27)
{
if (!(ch = getch()))
{
ch = getch();
if (isLShiftDown())
cout << "shift + ";
switch (ch)
{
case 75:
cout << "left" << endl;
break;
case 72:
cout << "up" << endl;
break;
case 77:
cout << "right" << endl;
break;
case 80:
cout << "down" << endl;
break;
default:
cout << (char)ch << endl;
break;
}
}
}
}
int get_state()
{
union REGS in, out;
in.h.ah = 2 ;
int86(0x16, &in, &out);
return(out.h.al);
}
int isLShiftDown()
{
unsigned char state;
state = (unsigned char) get_state();
if ((state &= 2) == 2)
return 1;
return 0;
}
نمونه برنامه در Visual Studio 2008 :
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
int isLShiftDown();
void main()
{
int ch = 0;
while(ch != 27)
{
if (!(ch = getch()))
{
ch = getch();
if (isLShiftDown())
cout << "shift + ";
switch (ch)
{
case 75:
cout << "left" << endl;
break;
case 72:
cout << "up" << endl;
break;
case 77:
cout << "right" << endl;
break;
case 80:
cout << "down" << endl;
break;
default:
cout << (char)ch << endl;
break;
}
}
}
}
int isLShiftDown()
{
if (GetKeyState(VK_LSHIFT) & 0xffff0000)
return 1;
return 0;
}
mahdi bg
14-12-2011, 11:42
سلام
منظور این بود که صفحه کنسول داره یک کاری رو انجام میده مثلا داره عدد نشون میده
وسط عدد نشون دادن کاربر یک کلید وارد کنه (مثال خولب نبود)
کلا می خوام بدونم رویدادی مثل keypress داره یانه؟
ممنون
Black Band
14-12-2011, 14:28
این روش ها بر اساس همون KeyPress هست، امیدوارم بدردتون بخوره :
من برای شما یه مثال میزنم تا متوجه بشید :
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
bool run = true;
while(run) //infinite loop
{
if(GetAsyncKeyState(VK_RETURN))
{
cout << "Enter has been pressed. " << endl;
}
else
}
if(GetAsyncKeyState(VK_ESCAPE))
{
cout << "Escape pressed, program exiting. " << endl;
run = false;
}
}
}
return 0;
}
این راه زیر می تونه، فشرده شدن یک دکمه رو نشون بده ( به true و While دقت کنید ) :
while(true)
{
if( GetAsyncKeyState( VK_RETURN ) == -32767 )
{
//one key press.
cout << "Enter." << endl;
}
}
ممکنه جای بعضی از پرانتز ها و علائم تغییر کنه، اینو دیگه کاریش نمی تونم بکنم...
فکر نکنم بیشتر از این بتونم به شما کمک کنم، بنابراین اگه جواب سوالتون رو نگرفتید باید ببخشید دیگه ..... به هر حال موفق باشید
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.