PDA

View Full Version : سوال: تشخیص این که چه کلیدی از صفحه کلید زده شده و واکنش به ان



اقای برنامه نویس
چهارشنبه 11 مهر 1397, 20:36 عصر
سلام . من دارم سعی می کنم در برنامه ام که تحت کنسول هست و برای ویندوز هست ، کاری کنم که کاربر به محض زدن کلیدی از صفحه کلید ، بدون زدن enter ، از طرف برنامه واکنشی ببیند . حالا فرض کنیم که قرار است واکنش برنامه چاپ همان علامتی که کاربر زده باشد . حالا من می خواهم به محض این که کاربر کلید ((+)+shift) (یعنی شیفت و +) را زد ، بدون این که enter زده شود برنامه سریعا + را چاپ کند و نگذارد که کاربر در ان خط بیشتر از این کاراکتر چیزی بنویسد .
من این کد رو امتحان کردم ( ولی مطمئن نیستم کاربردی در زمینه ی سوالم داره یا نه ) :


if(GetKeyState('A')&0x8000)){
cout << "Worked!";
}

ولی کامپایلر اجراش نمی کنه و ازش رد میشه و دستورات بعدی رو اجرا می کنه !(از ویژوال استودیو 2015 استفاده می کنم)
از تابعی مثل GetAsyncKeyState هم استفاده کردم اما نتیجه یکسان هست . (لازم به ذکر هست که کامپایلر ارور نمی ده و کتابخانه ی windows.h رو هم به برنامه اضافه کردم.)
کسی می تونه کمکم کنه ؟ ممنون میشم .

farhad_shiri_ex
پنج شنبه 12 مهر 1397, 09:06 صبح
سلام . من دارم سعی می کنم در برنامه ام که تحت کنسول هست و برای ویندوز هست ، کاری کنم که کاربر به محض زدن کلیدی از صفحه کلید ، بدون زدن enter ، از طرف برنامه واکنشی ببیند . حالا فرض کنیم که قرار است واکنش برنامه چاپ همان علامتی که کاربر زده باشد . حالا من می خواهم به محض این که کاربر کلید ((+)+shift) (یعنی شیفت و +) را زد ، بدون این که enter زده شود برنامه سریعا + را چاپ کند و نگذارد که کاربر در ان خط بیشتر از این کاراکتر چیزی بنویسد .
من این کد رو امتحان کردم ( ولی مطمئن نیستم کاربردی در زمینه ی سوالم داره یا نه ) :


if(GetKeyState('A')&0x8000)){
cout << "Worked!";
}

ولی کامپایلر اجراش نمی کنه و ازش رد میشه و دستورات بعدی رو اجرا می کنه !(از ویژوال استودیو 2015 استفاده می کنم)
از تابعی مثل GetAsyncKeyState هم استفاده کردم اما نتیجه یکسان هست . (لازم به ذکر هست که کامپایلر ارور نمی ده و کتابخانه ی windows.h رو هم به برنامه اضافه کردم.)
کسی می تونه کمکم کنه ؟ ممنون میشم .


#include <iostream>
#include <windows.h>
#include <bitset>
#include <conio.h>

using namespace std;

//must be set to the ASCII value of that character
//can use the virtual key code constants -> https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes

//If the high-order bit is 1, the key is down; otherwise, it is up.
//If the low-order bit is 1, the key is toggled.
//A key, such as the CAPS LOCK key, is toggled if it is turned on.
//The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.

int main()
{
cout << "press the (A or a) key:" ;

short p_key =0x0;

int a;
cin >> a ;
p_key=GetAsyncKeyState(0x41);
if(p_key){
cout << endl ;
cout << p_key << endl ;
cout << "key is (A) pressed.!" << endl;
cout << endl << endl ;
cout << bitset<16>(p_key) << endl ;
cout << bitset<16>(GetAsyncKeyState(0x41)&0x8000)<< endl;
} else
cout << "wrong key" << endl;

return 0;
}


نیازی هم به and کردن با ارزش ترین بیت نوع short یعنی (0x8000) با خروجی تابع GetAsyncKeyState نیست علتشم در تکه کد بالا اضافه کردم.
و بهتر هم هست از نسخه همزمان تابع GetAsyncKeyState استفاده بشه!
واینکه من فقط کدی گذاشتم که وقتی کلید a را فشرده شود واکنش نشان میده.