PDA

View Full Version : حرفه ای: حذف صدای دینگ در هنگام فوکاس شدن کنترل ها



hojjatshariffam
جمعه 18 تیر 1389, 22:41 عصر
سلام
بعضی وقتها موقعی خودمون یک کنترل مانند تکست باکس رو فوکاس می کنیم یک صدای دینگ کوچیک از سیستم شنیده میشه که در صورت تکرار پشت سر هم ، هم موجب اختلال در فرم و هم موجب اعصاب خوردی میشه

مثلا من به KeyDown فرم کد فوکاس تک تک تکست باکس ها رو نوشتم که کاربر با هر بار فشار اینتر بره به تکست باکس بعدی ، ولی با هر بار فشار کلید اینتر یک صدای دینگ از ویندوز بلند میشه ، من می خوام این صدا پخش نشه

کسی از دوستان حرفه ای می تونه کمکم کنه؟

مهدی فرزاد
شنبه 19 تیر 1389, 02:33 صبح
سلام
کافیه در آخر کدهایی که توی KeyDown نوشتی این کد رو اضافه کنی


e.Handled = true;

به همین راحتی از شر صدای دینگ خلاص میشی!
موفق باشی

hamid.shekasteh
شنبه 19 تیر 1389, 08:35 صبح
کافیه در آخر کدهایی که توی KeyDown نوشتی این کد رو اضافه کنی

کد HTML:
e.Handled = true;
به همین راحتی از شر صدای دینگ خلاص میشی!
موفق باشی


من امتحان کردم جواب نداد، دوستان شما تونستید جواب بگیرید؟

armin1100
شنبه 19 تیر 1389, 09:51 صبح
ميتوني وقتي برنامه روي كامپيوتر مقصد اجرا ميشه sound scheme رو غير فعال كني اين كار هم بصورت دستي از طريق control panel -sound-sound scheme انجام ميشه هم از طريق API ويندوز براي وب هم ميتوني اين كار رو بكني

مهدی فرزاد
شنبه 19 تیر 1389, 11:14 صبح
برای اینکه با زدن Enter از هر TextBox به TextBox دیگه بری بهترین کد اینه و من توی تمام برنامه هام امتحان میکنم و صدای دینگ هم نداره

برای WINApp


private void TextBox_KeyPress(object sender, KeyPressEventArgs e)
{
if(e.KeyChar == (Char)Keys.Return)
{
SendKeys.Send("{Tab}");
e.Handled = true;
}
}
}


برای WPF


private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
var uie = e.OriginalSource as UIElement;
if (e.Key == Key.Enter)
{
e.Handled = true;
uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}

hojjatshariffam
شنبه 19 تیر 1389, 14:03 عصر
سلام
کافیه در آخر کدهایی که توی KeyDown نوشتی این کد رو اضافه کنی


e.Handled = true;
به همین راحتی از شر صدای دینگ خلاص میشی!
موفق باشی
منم جواب نگرفتم
قبلا هم این رو استفاده می کردم
من از کد زیر استفاده می کنم



Control ctrl = sender as Control;
SelectNextControl(ctrl, true, true, true, true);

hojjatshariffam
شنبه 19 تیر 1389, 14:18 عصر
بچه ها من به نتیجه رسیدم

برا اینکه این صدای دینگ دیگه شنیده نشه باید تو ایونت KeyPress کد زیر رو بنویسید
البته به شرطی که به کارهای دیگه فرمتون اشکار نرسونه



private void txt_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Return)
e.Handled = true;
};

و برای ایونت KeyDown هم کد زیر رو بنویسید تا اینتر مانند TAB عمل کنه



private void ctrl_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Control ctrl = sender as Control;
SelectNextControl(ctrl, true, true, true, true);
}
}

البته به جای کد های آبی رنگ می تونید کد دوستمون Mehdi550u (http://barnamenevis.org/forum/member.php?u=67273) رو به شکل زیر هم وارد کنید



SendKeys.Send("{TAB}");

خلاصه به صورت زیر عمل کنید که :
مثلا اگه تو فرم ده بیست تا تکست باکس یا هر کنترل مشابه داشته باشین ، برای KeyDown همه این کنترل ها کد بالا رو(ctrl_KeyDown) انتخاب کنید در این صورت طبق TabIndex تک تکشون فوکاس میشن و دیگه صدای دینگ هم شنیده نمی شه(به شرط انتخابtxt_KeyPress برای ایونت KeyPress همه کنترل هایی که این کار رو در نظر دارید )

موفق باشید

مهدی فرزاد
شنبه 19 تیر 1389, 14:28 عصر
بله دوست عزیز کدی رو که من گفتن باید در KeyPress بنویسید اما برای WPF در KeyUp و همچنین این کار رو میتونید فقط توی Event یکی از کنترل هاتون بگذارید و بقیه کنترل ها رو به Event اون متصل کنید. موفق باشید

Sajjad.Aghapour
شنبه 19 تیر 1389, 14:31 عصر
حالت کلی که برای این کار وجود داره استفاده از کد زیر است:


private void txt_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
}
}

private void txt_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
SendKeys.Send("{TAB}");
e.Handled = true;
}
}


موفق باشید/

hojjatshariffam
شنبه 19 تیر 1389, 14:31 عصر
ضمنا می تونید فقط رویداد KeyPress رو استفاده کنید به این صورت:
البته برای همه کنترل های لازم



private void ctrl_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
e.Handled = true;
Control ctrl = sender as Control;
SelectNextControl(ctrl, true, true, true, true);
}
}


به یاد داشته باشید که کد e.Handled = true می تونه بعضی جاها مشکل ساز باشه و فرمتونو بعضی جاها دچار مشکل کنه
مثلا در DataGridView این کد مانع از رفتن به ردیف بعدی میشه چون با فشار کلید اینتر در دیتا گرید ویو همیشه از یک ردیف به ردیف بعدی می ره مگر اینکه خودمون نخواهیم این اتفاق بیوفته

hojjatshariffam
شنبه 19 تیر 1389, 14:44 عصر
حالت کلی که برای این کار وجود داره استفاده از کد زیر است:


private void txt_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
}
}


موفق باشید/
دوست عزیز میشه کدی که رنگش قرمز شده رو دقیقا کارشو تشریح کنید ، برام جالبه
دقیقا کارش چیه؟

daniyal_1363
شنبه 16 مرداد 1389, 07:57 صبح
keypreview فرم رو ترو و بعد این کد هایی که گفتید رو در keydown فرم بنویسید