PDA

View Full Version : شناسایی Arrow key ها



emad_67
جمعه 22 تیر 1386, 21:08 عصر
فرض کنید من میخوام برنامه ای بنویسم که اگه کاربر right Arrow رو زد یه عملیاتی انجام بشه حالا من چه جوری میتونم این دکمه رو شناسایی کنم تو جدول کد های اسکی هم نگاه کردم مثلا برای right Arrow کدش رو نوشته 77;0 حالا چه جوری میتونم این کد رو مثلا تو یه شرط چک کنم؟

alireza643
شنبه 23 تیر 1386, 07:33 صبح
یادمه که تابعی بود به نام GetAsyncKeyState() که یه ورودی int میگرفت مثل همون 77 و بعد شما میتونیستد خروجی این تابع رو استفاده کنید و وضعیت کلید رو متوجه بشید.
از تابع GetKeyboardState هم اگر میخواهید وضغیت کل کلید ها رو به دست بیارید میتونی استفاده کنید.

emad_67
شنبه 23 تیر 1386, 08:39 صبح
این توابع تو چه هدری قرار دارند و چه جوری عمل میکنند مثلا وقتی که یه int دریافت کردند خروجی اونا به چه صورته ؟ یه int برمیگردونه؟

alireza643
شنبه 23 تیر 1386, 10:06 صبح
تو هدر Windows.h میتونید از این توابع استفاده کنید.

emad_67
شنبه 23 تیر 1386, 13:28 عصر
میشه لطف کنید یه مثال کوچیک بزنید من که درست متوجه نشدم چه جوری کار میکنه تو msdn هم گشتم ولی اون جا هم مثالی نبود البته به یه مشکل دیگه هم بر خوردم که چه جوری اصلا اون کاراکتر یا کد کلید های جهت دار رو از ورودی بگیرم تا الان تصمیم داشتم با getch این کارو بکنم ولی الان که امتحان کردم اصلا کد های این کلید ها در محدوده getch نمیگنجه یهنی تمام کد های اونو معادل کد 224 یا همون کارکتر آلفا در نظر میگیره حالا در مورد این هم اگه راه دیگه ای هست ممنون میشم بگید

alireza643
شنبه 23 تیر 1386, 15:47 عصر
ببین آقا عماد شما این تابع رو مینویسی و بعد به عنوان ورودی شماره کلید مورد نظر یا اسم اون رو مینویسی. اسم کلید ها تو MSDN نوشته شده. برای مثال برای کلید بالا که خودت گفتی شماره اون کلید 26 و اسمش VK_UP هست و مقدار برگشتی تابع رو تو یه متغیر نگهداری میکنی اگر این مقدار مخالف صفر بود یعنی کلید فشار داده شده و اگر صفر بود یعنی در حال حاضر کلید فشار داده نشده.



short keyStat;
for(;;)
{
keyStat = GetAsyncKeyState(VK_UP);
if (keyStat == 0)
{
Sleep(1000);
}
else
{
break;
}
}

توی این برنامه یه حلقه بی نهایت تشکیل شده که تو هر بار اجرا بررسی میشه که کلید بالا فشار داده شده یا نه اگر فشار داده نشده بود که برنامه 1 ثانیه صبر میکنه و حلقه دوباره اجرا میشه ولی اگر فشار داده بشه برنامه از حلقه خارج میشه.