PDA

View Full Version : كليد شيفت به همراه كليد هاي حركتي



davodsharif
چهارشنبه 09 دی 1388, 00:11 صبح
سلام
من ميخوام تو برنامه ، فشرده شدن كليد شيفت و يكي از كليد هاي حركتي رو تشخيص بدم (بالا ، پايين ، چپ ، راست) . ميخوام براي انتخاب متن ازش استفاده كنم . - از موس نبايد استفاده كنم- كسي ميتونه كمك كنه ؟

qwerty11
چهارشنبه 09 دی 1388, 04:40 صبح
کلید شیفت رو نمیدونم اما برای تشخیص فشرده شدن کلیدهای بالا و پایین و چپ و راست :


int c=(int)getch(),d=0;
if(c==0) d=(int)getch();
// d=72 ==> UP
// d=80 ==> DOWN
// d=77 ==> RIGHT
// d=75 ==> LEFT

ویرایش : یه سرچ تو نت درباره ی شیفت زدم، اونجا نوشته بودن که نمیشه فشرده شدن کلید شیفت رو تشخیص داد.

davodsharif
پنج شنبه 10 دی 1388, 23:15 عصر
سلام
از اينكه به سوال من جواب داديد ممنونم . اما اين برام قابل قبول نيست كه كليد شيفت رو نشه تشخيص داد . مثال نقض شما هم اديتور هايي كه با c نوشته شدند و با شيفت و كليد هاي حركتي براي انتخاب متن استفاده ميكنند

بانوی ایران
پنج شنبه 10 دی 1388, 23:39 عصر
سلام ميشه راجع به اون كد نوشته شده(كليد راست و چپ ..)يه توضيح بديد

#Elahe#
جمعه 11 دی 1388, 06:36 صبح
کلید شیفت رو نمیدونم اما برای تشخیص فشرده شدن کلیدهای بالا و پایین و چپ و راست :


int c=(int)getch(),d=0;
if(c==0) d=(int)getch();
// d=72 ==> UP
// d=80 ==> DOWN
// d=77 ==> RIGHT
// d=75 ==> LEFT
ویرایش : یه سرچ تو نت درباره ی شیفت زدم، اونجا نوشته بودن که نمیشه فشرده شدن کلید شیفت رو تشخیص داد.



منظور از این اعداد چیه ؟
اصلا لطف کنید و این کدها رو یه توضیح مختصر بدید !!:لبخندساده:

clover
جمعه 11 دی 1388, 16:09 عصر
اولا تصمیم بگیرید که در چه محیطی و با چه کامپایلری می خواهید کار کنید (مگر اینکه بخواهید مستقیما با وقفه های بایوس کار کنید.)

برای تشخیص فشرده بودن کلید Shift :
برای داس از تابع int86 استفاده می شود (هدر فایل dos.h) که ظاهرا در Visual Studio پشتیبانی نمی شود (یا شاید هم طریقه استفاده تغییر کرده).
برای ویندوز هم می توان از تابع GetKeyState از توابع API (هدر فایل windows.h) استفاده کرد.

در مورد کلید های جهت نما و کدهای اسکی آنها در تاپیک زیر توضیحات کاملی را پیدا خواهید کرد:

http://barnamenevis.org/forum/showthread.php?t=123242

نمونه برنامه در 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;
}

qwerty11
جمعه 11 دی 1388, 18:46 عصر
منظور از این اعداد چیه ؟
اصلا لطف کنید و این کدها رو یه توضیح مختصر بدید عدده دیگه :لبخند: مثل بقیه ی عددا.

فشار دادن کلیدهای بالا و پایین و چپ و راست برابر با دوبار عمل getch هست ! که اولی برابر صفر و دومی هم برابر هموناییه که نوشتم. کلید های f1 , f2 , f3 , ... هم این شکلی هستن. در حقیقت اگر getch اولی NULL نبود یعنی این دکمه ها فشار داده نشدن.

davodsharif
شنبه 12 دی 1388, 01:42 صبح
سلام دوباره
دوست عزيز : qwerty11 (http://barnamenevis.org/forum/member.php?u=97849) ممنون بابت لطفتون . من تست كردم فقط با شيفت چپ جواب درست ميده . با شيفت راست هنوز جواب نمي ده باز هم ممنون

clover
شنبه 12 دی 1388, 10:15 صبح
دوست عزيز : qwerty11 ممنون بابت لطفتون .
بنده clover هستم:لبخندساده:.

من تست كردم فقط با شيفت چپ جواب درست ميده .
علت این هست که هر دوی این برنامه ها برای شیفت چپ نوشته شده اند که با کمی تغییر برای تمام کلید ها قابل استفاده خواهند بود.
برای برنامه اول، تابع isLShiftDown را به این صورت ویرایش کنید:

int isLShiftDown()
{
unsigned char state;
state = (unsigned char) get_state();
if ((state &= 3) != 0)
return 1;

return 0;
}
برای راهنمایی بیشتر این تاپیک را ملاحظه کنید:

http://barnamenevis.org/forum/showpost.php?p=722491&postcount=4

برای برنامه دوم هم می تونید با تغییر پارامتر تابع GetKeyStateفشرده بودن شیفت راست را هم چک کنید:

int isLShiftDown()
{
if (GetKeyState(VK_LSHIFT) || GetKeyState(VK_RSHIFT) & 0xffff0000)
return 1;

return 0;
}
برای مشاهده لیست کامل virtual-key Codes این صفحه را ملاحظه کنید:

http://msdn.microsoft.com/en-us/library/ms927178.aspx

البته بهتر است تابعی جداگانه برای این مورد بسازید چون isLShiftDown همانطور که از نامش پیداست برای شیفت چپ نوشته شده:لبخندساده:.

shaparaktalaeii
پنج شنبه 26 فروردین 1389, 12:45 عصر
چرا با آن که تمامی سیستم ها از Asciicode استفاده می کنند و کد اسکی 256 کاراکتر در خود جای میدهد پس بقیه کاراکترها چه می شونند مثلا حروف چینی چگونه در کنار حروف فارسی و انگلیسی جای داده می شود؟؟ :متفکر::متفکر:

user1101
پنج شنبه 26 فروردین 1389, 21:49 عصر
چرا با آن که تمامی سیستم ها از Asciicode استفاده می کنند و کد اسکی 256 کاراکتر در خود جای میدهد پس بقیه کاراکترها چه می شونند مثلا حروف چینی چگونه در کنار حروف فارسی و انگلیسی جای داده می شود؟؟ :متفکر::متفکر:

کد اسکی خودش انواع مختلفی داره با کد اسکی 8 بیتی می شه 256 کاراکتر رو کد کرد که شامل حروف انگلیسی، ارقام و برخی از کلید های ترکیبی هست ، جدول کداسکی رو اینجا (http://www.motionnet.com/cgi-bin/search.exe?a=showlink&no=65) می تونی ببینی، برای کد کردن حروف زبان های دیگه مثل فارسی و ... از یونی کد unicode استفاده می شه که یه سیستم کد 2 بایتی هست که تقریبا از تمامی زبان های زنده دنیا پشتیبانی می کنه ، بایت اول مشخص کننده ی زبان هست و بایت دوم یک کاراکتر در اون زبان رو مشخص می کنه مثلا کد حرف پ با نمایش هگز(مبنای 16) می شه : 067E که 06 مشخص کننده ی زبان فارسی هست