PDA

View Full Version : تشخیص اینکه K فشرده شده یا کلید جهت نمای چپ؟



s.kamal
دوشنبه 27 دی 1389, 13:13 عصر
دوستان همین طور که میدونید کد اسکی کلید جهت نمای چپ 75 هستش و کد اسکی حرف k هم همینه.
حالا اگه بخاهیم بفهمیم که کدوم یکی از این ها زده شده باید چیکار کرد.

quiet_programmer
دوشنبه 27 دی 1389, 15:14 عصر
نه اینطور نیست. وقتی شما یه کلید کنترلی رو فشار میدین در واقع دوتا کد اسکی میره تو بافر اول یه صفر و بعد یه عدد دیگه که این دوتا کد اسکی اون کلید کنترلی رو با هم تشکیل میدن مثلا برای کلید کنترلی چپ کد اسکی که میره داخل بافر 0075 هست.

حالا کار راحت شد اول یه کاراکتر از ورودی میخونی بعد برسی میکنی با صفر اگه صفر بود یه کاراکتر دیگه هم میخونی که اگه برابر 75 بود اونوقت تشخیص میدین که کلید چپ زده شده.

مثل برنامه زیر که کلیدهای جهت فشرده شده توسط کاربر رو تشخیص میده. با کلید ESC برنامه تموم میشه.


#include <iostream.h>
#include <conio.h>
void main()
{
char ch;
while((ch=getch())!=27)
{
if (!ch)
{
ch=getch();
switch(ch)
{
case 77:
cout<<"Right"<<endl;
break;
case 75:
cout<<"Left"<<endl;
break;
case 72:
cout<<"Up"<<endl;
break;
case 80:
cout<<"Down"<<endl;
break;
}
}
}
}

MPERSIA
شنبه 12 مرداد 1392, 21:53 عصر
سلام
من این کد رو تست کردم ولی چیزی نشون نداد؟
من از studio 2010 استفاده میکنم
باید کد رو تغییرش بدم آیا؟

MPERSIA
یک شنبه 13 مرداد 1392, 19:49 عصر
نه اینطور نیست. وقتی شما یه کلید کنترلی رو فشار میدین در واقع دوتا کد اسکی میره تو بافر اول یه صفر و بعد یه عدد دیگه که این دوتا کد اسکی اون کلید کنترلی رو با هم تشکیل میدن مثلا برای کلید کنترلی چپ کد اسکی که میره داخل بافر 0075 هست.

حالا کار راحت شد اول یه کاراکتر از ورودی میخونی بعد برسی میکنی با صفر اگه صفر بود یه کاراکتر دیگه هم میخونی که اگه برابر 75 بود اونوقت تشخیص میدین که کلید چپ زده شده.

مثل برنامه زیر که کلیدهای جهت فشرده شده توسط کاربر رو تشخیص میده. با کلید ESC برنامه تموم میشه.


#include <iostream.h>
#include <conio.h>
void main()
{
char ch;
while((ch=getch())!=27)
{
if (!ch)
{
ch=getch();
switch(ch)
{
case 77:
cout<<"Right"<<endl;
break;
case 75:
cout<<"Left"<<endl;
break;
case 72:
cout<<"Up"<<endl;
break;
case 80:
cout<<"Down"<<endl;
break;
}
}
}
}

سلام
دادا بازم ممون
ولی این کد رو چطو تو برنامم بذارم که بتونم انتخابای دیگه ای هم داشته باشم؟
من این کد را واسه صفحه عوض کردن لازم داشتم، حالا صفحه عوض میشه ولی کلیدای دیگه کار نمیکنن؟
مثلا تو هر صفحه چنت گزینه واسه انتخاب هست که باشماره کار میکنن ولی وقتی این کد رو گذاشتم نتونستم از شماره ها استفاده کنم
میدونم بخاطر getch هستش ولی نمیدونم چطو درستش کنم
خواهشمندم به یاری ام بشتابید
با سپاس فراوان

Yousof_Paradox
جمعه 22 آبان 1394, 15:28 عصر
سلام
من این کد رو تست کردم ولی چیزی نشون نداد؟
من از studio 2010 استفاده میکنم
باید کد رو تغییرش بدم آیا؟

منم مشکلتو داشتم ولی یکم سیخونکش کردم درست شد. اون قسمت که if(!ch علامت تعجبشو بردار حله

Ananas
شنبه 23 آبان 1394, 22:25 عصر
سلام.
از تابع GetAsyncKeyState استفاده کنید. برای مثال میتونید از دو تابعی که نوشتم برای تست فشرده بودن یا نبودن کلید استفاده کنید:

bool KeyIsUp(int key)
{
return ((GetAsyncKeyState(key) & 0x8000) == 0);
};

bool KeyIsDown(int key)
{
return !KeyIsUp(key);
};

ورودیه این توابع int هست. کلید های کیبورد در ویندوز با مکرو هایی تعریف شده که با حروف VK یعنی Virtual Key شروع میشن. مثلا کلید های موس به این شکل هستند :
VK_LBUTTON
VK_MBUTTON
VK_RBUTTON
کلید چپ و وسط و راست موس هستند به ترتیب.
و برای کیبرد هم مثلا کلید های جهت هستند:
VK_LEFT
VK_RIGHT
VK_UP
VK_BOTTOM
و یا کلید های VK_SHIFT
VK_CONTROL
VK_MENU
به ترتیب کلید شیفت و کنترل و Alt رو مشخص میکنن. کلید Alt به نام MENU هست.
و کلید هایی که برای اعداد هستند به عبارت NUMPAD شروع میشن:
VK_NUMPAD1
VK_NUMPAD2
VK_NUMPAD13
VK_NUMPAD4
...
و اما کلید های حروف براشون مکرو تعریف نشده و میتونید از تابع vkKeyScan استفاده کنید و برای ورودی اون حرف رو به شکل کوچک بنویسید.
یک مثال برای کلید های m و چپ موس و چپ کیبرد:

#include <Windows.h>

#include <iostream>

bool KeyIsUp(int key)
{
return ((GetAsyncKeyState(key) & 0x8000) == 0);
};

bool KeyIsDown(int key)
{
return !KeyIsUp(key);
};

int main()
{
while (true)
{
if (KeyIsDown(VkKeyScanA('m')))
std::cout << "m Key" << std::endl;
else if (KeyIsDown(VK_LBUTTON))
std::cout << "Mouse_Left" << std::endl;
else if (KeyIsDown(VK_LEFT))
std::cout << "Keyboard_Left" << std::endl;
else
std::cout << "..." << std::endl;
};

return 0;
}



تو این مثال بعد از اجرا کلید m یا کلید چپ موس یا کلید چپ کیبرد رو بزنید تو صفحه پرینت میشه.