PDA

View Full Version : سوال: shortcutkey براي دو تا كاراكتر:مثلا alt+a,e



mahboube
پنج شنبه 18 آذر 1389, 08:38 صبح
سلام
چطوري ميشه shortcutkey براي دو تا حرف يا عدد درست كرد؟مثلا alt+a,e .
يعني alt و a و e سه تاش باهم بايد فشرده شه؟

M.YasPro
پنج شنبه 18 آذر 1389, 09:28 صبح
سلام
برای اینکار از توابع api استفاده می کنند .
GetKeyboardState
اما از این کد هم میشه استفاده کرد :

bool flag = false;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Alt && e.KeyCode == Keys.A)
flag = true;
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.B && flag)
{
MessageBox.Show("");
flag = false;
}
}
موفق باشید .

mahboube
پنج شنبه 18 آذر 1389, 09:59 صبح
فقط يك سوال ديگه.من ميخوام براي مثلا alt+a يكاري انجام بده(مثلا يك منو رو باز كنه).و بعد ازاون حرف بعديو كه زد يكاره ديگه انجام بده؟؟
فك كنم باتابع api نشه!!ميشه؟
بعد چون منو و زير منو زياد دارم اين flag هم نمي دونم ميشه يا نه!

mahboube
شنبه 20 آذر 1389, 09:53 صبح
كنترل منو خودش به صورتي هستش كه اگر alt+حرف اول مثلا اولي آيتم منو فشرده بشه اون منو رو باز ميكنه و حالا اگر حرف اول هركدوم از زير منو هاش فشرده شه اون زيرمنو رو انتخاب مب كنه.مثلا براي منوي file كه گزينه Open توش هست.alt+f منوي فايل رو باز ميكنه و o زيرمنويopen رو اجرا ميكنه.من ميخام اينو به صورت عددي پياده كنم.يعني alt+1 منويfile رو باز كنه و 1 بعدي گزينه open رو.
مشكلي كه وجو داره اينه كه به زسر منو ها ميشه shortcutkey عددي داد ولي به header ها نميشه.برا همين بايد توي key down خود منو نوشته شه.
كه اونجام نميتونم بگم مثلا برا alt+1 منو رو باز كن منتظر گرفتن كاراكتر بعدي شو.
ممنون ميشم اگر كسي ايده اي داره بهم بگه.

mahboube
شنبه 20 آذر 1389, 11:34 صبح
من كه نتونستم اينو درست كنم.حالا دوتا سوال:
1-آيا ميشه وقتي كاربر يك كليد رو زد گرفتش و يه كد ديگه بهش داد و برا ي keydown فرستاد؟؟

2-آ يا كامپوننتي مثل جانوس يا dev وجود داره كه منو هاي باقابليت بهتر داشته باشه؟

chasbonakam
شنبه 20 آذر 1389, 12:25 عصر
سلام
بدون api هم میشه

ابتدا می ری خاصیت keypreview فرم رو true می کنی

بعد تو رویداد Keypressیا keydown این کد رو می نویسی


if(e.control)
switch(e.keycode)
{
case keys.R:
CallMenu
break;

case keys.P
call Menu P;
break;
}



شَما به جای Call Menu هر اتفاقی که قراره با فشردن این دکمه ها بیفته بنویس

mahboube
شنبه 20 آذر 1389, 13:30 عصر
سلام
بدون api هم میشه

ابتدا می ری خاصیت keypreview فرم رو true می کنی

بعد تو رویداد Keypressیا keydown این کد رو می نویسی


if(e.control)
switch(e.keycode)
{
case keys.R:
CallMenu
break;

case keys.P
call Menu P;
break;
}



شَما به جای Call Menu هر اتفاقی که قراره با فشردن این دکمه ها بیفته بنویس

بعد اين دوتا كليدش كجاش؟!!

chasbonakam
شنبه 20 آذر 1389, 13:39 عصر
Control +p

یا Control+R

kamran00f
شنبه 20 آذر 1389, 14:09 عصر
سلام
برای اینکار از توابع api استفاده می کنند .
GetKeyboardState
اما از این کد هم میشه استفاده کرد :

bool flag = false;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Alt && e.KeyCode == Keys.A)
flag = true;
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.B && flag)
{
MessageBox.Show("");
flag = false;
}
}
موفق باشید .

این کد یه مشکل داره. وقتی طرف دکمه های Alt و a رو یه بار یزنه و ول کنه (بدون اینکه e) رو فشار بده. بازم flag برابر true میشه و بعد از اون هرموقع دکمه ی E به تنهایی زده شه اتفاق مورد نظر رخ میده ) حتی اگه alt و a فشرده نشده باشه! تو متد keyUp همیشه باید در آخر متد flag=false; نوشته شه!

M.YasPro
شنبه 20 آذر 1389, 14:55 عصر
ممنون از توجهت ، منبعی که این روش رو معرفی کرده بود هم گفته بود که باید از یه تایمر استفاده کرد ، ولی من به خاطر ساده نوشتن این کد رو همینجوری ارائه کردم .

mahboube
شنبه 20 آذر 1389, 15:20 عصر
ممنون از جفت دوستان.ولي من اينو دارم براي منو ها مينويسم و منو ها يك خاصيت جالب دارن و اين اينه كه وقتي يك منو باز ميشه ديگه هيچ رويداد keydown ازفرم يا خود منو و... اجرا نميشه.(چون همه منو ها خودشون shortcutkey )دارن و يه جورايي ايونت keydown تو زماني كه بازن برا خودشونه!!!!
براي همين من نتونستم كاري كه ميخوام رو انجام بدم.ولي راهنماي هاتون كمك كرد.ممنون