PDA

View Full Version : سوال: طرز دسترسی و کنترل کلیدهای فشرده شده در محیط برنامه



navid1n2000
جمعه 08 شهریور 1387, 19:39 عصر
سلام
من میخوام بدونم در طول برنامه چه طور می تونم کلید هایی رو که کاربر فشار میده کنترل کنم .و البته کدهای صفحه کلید رو میخوام . ممنون

Salar Ashgi
جمعه 08 شهریور 1387, 23:14 عصر
سلام ، منظورتون از کنترل چیه ؟؟؟ ثبت کردن کلید های زده شده ، غیر فعال کردن آنها یا ....

لطفا واضح تر بفرمایید !!!!

saber4166
شنبه 09 شهریور 1387, 00:35 صبح
سلام
privatevoid frm_KeyDown(object sender, KeyEventArgs e)
{
//EXIT form program
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
{

که بعد از Keys . (دات) رو بزنی کل کلید ها رو میبینی
موفق باشی

saber4166
شنبه 09 شهریور 1387, 00:37 صبح
راستی یه چیزی یادم رفت حتما خاصیت keypreview فرمت رو true کن یادت نره

saber4166
شنبه 09 شهریور 1387, 00:40 صبح
این هم کنترل کلید ها
این کد از ورود حروف جلو گیری میکند
privatevoid textbox_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsLetter(Convert.ToChar(e.KeyChar)))
e.Handled = true;
}

saber4166
شنبه 09 شهریور 1387, 00:41 صبح
اینم از ورود اعداد جلو گیری میکنه
privatevoid textbox_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsNumber(Convert.ToChar(e.KeyChar)))
e.Handled = true;
}


موفق باشید

navid1n2000
یک شنبه 10 شهریور 1387, 10:58 صبح
سلام
منظورم اینه که من بتونم کنترل کنم که کاربر اگر دکمه ای را فشار داد چه اتفاقی بیفته . منظور کدهای کلیدهای صفحه کلیده . از کجا بدست بیارمشون ؟بای

bsng110
یک شنبه 10 شهریور 1387, 13:08 عصر
هوالحکیم
سلام
فکر کنم منظور دوستمون را فهمیده باشم. این شکلی که دوست عزیزمون saber4166 گفتند، فقط می شه کلید هایی که بر روی فلان textbox یا کامپوننت زده شده را کنترل کرد و اگر بخواهیم تمام کلید هایی که کاربر در فرم می زند را پردازش کنیم، مجبوریم که هزاران بار این متد را برای تمام کامپوننت های داخل صفحه ملغی کنیم و ...! اما روشی وجود دارد که پسرخاله عزیز آقای محمّد عبدالهی به بنده آموخته اند و جا دارد که اینجا از ایشان نیز تشکر کنم. به طور کلی در یک فرم یا User Control تابعی به نام ProcessCmdKey وجود دارد(دقت کنید که هر جایی این تابع وجود ندارد مثلاً اگر خودتان یک کامپوننت بسازید یا یک ClassLibrary چنین متدی را نخواهید یافت!). وظیفه این تابع همان چیزی است که دوست عزیزمان navid1n2000 می خواهند. هر موقع دکمه ای توسط صفحه کلید فشرده شود، اول این تابع فراخوانی می شود و چناچه ما در این تابع، کلید مورد نظر را مصرف نکردیم، این کلید به کنترل داخل فرم ارسال می شود(مثلاً textBox و ...). برای پیاده سازی این تابع، باید آن را ملغی یا override کرد. کافیست در فرم یا usercontrol خود کلمه override را نوشته و ابتدای نام این تابع را بنویسید. به محض مشاهده آن، کلید enter را بزنید تا تابعی مشابه کد زیر بوجود آید:


protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
int i, n;return base.ProcessCmdKey(ref msg, keyData);
}

همانطور که مشاهده می کنید، این تابع به صورت پیش فرض، کلید فشرده شده را به سطح بالاتر پاس می کند و خروجی آن سطح را بر می گرداند. فرض کنید بخواهیم کدی بنویسیم که چنانچه کاربر کلید enter را زد، ما عمل دکمه btnOk را انجام دهیم. کد زیر را در نظر بگیرید:


protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter)
{
btnOk.PerformClick();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}

کلیدی که فشرده شده است را می توانیم از طریق keydata بررسی کنیم. در کد بالا بررسی کرده ایم که چنانچه کلید فشرده شده با کلید enter برابر بود، متد اجرای کلیک دکمه btnOk فراخونی شود. دقت کنید که لیست تمام دکمه های صفحه کلید(حتی این صفحه کلید های جنگولکی که شونصد تا دکمه دارند) در تایپ شمارشی(enum) به نام Keys قرار دارد و نیازی به نوشتن کد و ... برای آنها نداریم و این کار اصلاً پیشنهاد هم نمی شود(به دلایل قابلیت حمل). حال که کلید enter را مصرف کردیم، از تابع خارج می شویم و true بر می گردانیم یعنی اینکه این کلید مصرف شد و دیگر این کلید را به سطوح بالاتر ارسال نکن.
اگر قصد استفاده از کلید را ندارید و یا می خواهید دیگران نیز از فشرده شدن آن با خبر شوند، false برگردانید. دقت کنید که این متد برای کنترل ها وجود دارد و چونکه ممکن است در یک فرم، چندین کنترل تو در تو وجود داشته باشند، به محض فشرده شدن یک کلید، متد ProcessCmdKey آن کنترل فراخوانی می شود و چنانچه این کنترل بخواهد عکس العمل کنترل پدر خود را برگرداند، باید همان مقداری که به صورت پیش فرض بر می گردد یعنی base.ProcessCmdKey(ref msg, keyData); را فراخوانی کند.
یا علی
حق نگهدارتان