PDA

View Full Version : keydown



pooyansystem
دوشنبه 01 بهمن 1386, 07:20 صبح
سلام
در بعضی از کنترلها مثل splitContainer وقتی در رویداد keydown کدی می نویسیم برای بعضی از کلید ها کار نمیکنه مثلا اگر کلید left را فشار بدیم این رویداد فرا خوانی نمیشه ولی اگه یکی از حروف مثلا a رو فشار بدیم وارد این رویداد میشه من می خوام بررسی کنم که اگه کلید left فشار داده شد یک عملی رو انجام بده ولی نمیشه میشه بگید من باید چیکار کنم

در واقع برای 4 کلید جهت نما رویداد keydown فراخوانی نمیشه نه در این کنترل بلکه در بسیاری از موارد چرا و چیکار باید کرد؟

dr_csharp
دوشنبه 01 بهمن 1386, 16:52 عصر
یه راه حلش اینه که با استفاده از توابع API ویندوز کلید فشرده شده رو handle کنی ..

pooyansystem
سه شنبه 02 بهمن 1386, 09:18 صبح
Certain keys, such as the TAB, RETURN, ESCAPE, and arrow keys are handled by controls automatically. To have these keys raise the KeyDown event, you must override the IsInputKey (http://barnamenevis.org/forum/ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/CPref17/html/M_System_Windows_Forms_Control_IsInputKey_1_5edffc 31.htm) method in each control on your form. The code for the override of the IsInputKey would need to determine if one of the special keys is pressed and return a value of true.

این چیزی است که تو help خود vs نوشته ولی من متوجه نشدم کسی میتونه بگه IsInputKey چیه و من چه طور اونو override کنم تا بتونم کلید های جهت نما را در keydown تشخیص بدم

programmable
سه شنبه 02 بهمن 1386, 18:02 عصر
بعضی از کلید ها از جمله Tab این مشکلی که شما اشاره کردید رو دارند .ما باید تابعIsInputKey رو override کنیم. کنترل هایی که در برنامه هامون استفاده میکنیم دارای این تابع میباشند. این تابع بررسی میکنه که آیا کلیدی که در فوکوس این کنترل زده شده یک کلید معمولی هستش یا این که یک کلیدی هست که نیاز به پردازش داره !
در override کردن این تابع در واقع چه کاری انجام میدیم؟ با این کار می گوییم که این رویداد ها برای کلید های خاص قابل انجام شود ! همین!

پس هر کنترلی رو که خواستیم رویداد KeyDown کلیدی چون Tab رو براش Firable! کنیم رو دوباره میسازیم به شکل زیر بنابر مثال خود MSDN :


public class MyControl : System.Windows.Forms.FormControl
{
protected override bool IsInputKey (System.Windows.Forms.Keys keyData)
{
switch(keyData)
{case Keys.Tab:
return true;
default:
return base.IsInputKey(keyData);
}
}
}
در این مثال FormControl در واقع اون کنترلی هست که میخواهیم رویداد رو براش فعال کنیم.
در قسمت switch هر کلیدی رو که خواستیم به عنوان کلید مورد نظر معرفی کنیم قرار میدیم که در اینجا کلید Tab قرار داده شده .