تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 4 از 4

نام تاپيک: تشخیص فشرده شدن کلید در محیط کنسول 2008 C++

  1. #1
    آخر فروم باز mahdi bg's Avatar
    تاريخ عضويت
    May 2006
    محل سكونت
    مشهد
    پست ها
    1,543

    پيش فرض تشخیص فشرده شدن کلید در محیط کنسول 2008 C++

    سلام
    چطوری می تونم توی کنسول C++ 2008 تشخیص بدم که یک کلید فشرده شده است؟

    ممنون

  2. #2
    داره خودمونی میشه Black Band's Avatar
    تاريخ عضويت
    Dec 2011
    محل سكونت
    Shiraz
    پست ها
    103

    پيش فرض

    نحوه ی تشخیص کلید های بالا، پایین، چپ و راست :

    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;
    }

  3. #3
    آخر فروم باز mahdi bg's Avatar
    تاريخ عضويت
    May 2006
    محل سكونت
    مشهد
    پست ها
    1,543

    پيش فرض

    سلام
    منظور این بود که صفحه کنسول داره یک کاری رو انجام میده مثلا داره عدد نشون میده
    وسط عدد نشون دادن کاربر یک کلید وارد کنه (مثال خولب نبود)
    کلا می خوام بدونم رویدادی مثل keypress داره یانه؟

    ممنون

  4. #4
    داره خودمونی میشه Black Band's Avatar
    تاريخ عضويت
    Dec 2011
    محل سكونت
    Shiraz
    پست ها
    103

    پيش فرض

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

    }

    ممکنه جای بعضی از پرانتز ها و علائم تغییر کنه، اینو دیگه کاریش نمی تونم بکنم...

    فکر نکنم بیشتر از این بتونم به شما کمک کنم، بنابراین اگه جواب سوالتون رو نگرفتید باید ببخشید دیگه ..... به هر حال موفق باشید
    Last edited by Black Band; 14-12-2011 at 14:34.

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •