کلیدهای ترکیبی در فرم سی شارپ و ساخت کلید میانبور در سی شارپ

کلیدهای ترکیبی، نقش مهمی در نرم‌افزارها و حتی بعضی از بازی‌های کامپیوتری دارند و یکی از کاربردهای آنها، تعیین کلیدهای میانبور برای برخی از وظایف نرم‌افزار می‌باشد. برای مثال، زمانی که Ctrl+S فشار داده شد، چیزی ذحیره شود!

برای مدیریت کلیدهای ترکیبی، راه‌های زیادی وجود دارد که در ادامه دو روش مختلف را معرفی می‌کنیم.

روش اول

 یکی از بهترین روش‌های پیاده‌سازی این قابلیت، Override کردن متد ProcessCmdKey فرم (Form) می‌باشد:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == (Keys.Control | Keys.F)) {
    MessageBox.Show("WWW.FullKade.Com");
    return true;
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

در اینجا با استفاده از یک | بیتی (اور بیتی)، تعیین کرده‌ایم که اگر Ctrl+F فشرده شد، پیامی را در MessageBox به کاربر نمایش داده و مقدار true را از متد برگرداند؛ این مقدار به سیستم می‌گوید که کلید مدیریت شده و در خارج از متد، دیگر تاثیی نداشته باشد (مثلا کلید Alt+F4 باعث بسته شدن فرم می‌شود که اگر true برگردد، مقدار پیشفرض آن دیگر از کار می‌افتد). و همچنین در اینجا مشخص کرده‌ایم اگر کلید ترکیبی Ctrl+F فشار داده نشده بود، متد اصلی فرم را از طریق base فراخوانی کند.

روش دوم

به جای استفاده از متد ProcessCmdKey، می‌توان از رویداد KeyDown فرم استفاده کرد:

private void Form_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.F)
    {
        MessageBox.Show("WWW.FullKade.Com");
    }
}

در روش قبلی، با برگرداندن true و false مشخص کردیم که کلید مدیریت شده و دیگر پیشفرض آن اجرا نشود! اما در اینجا بایستی مقدار ویژگی Handled ورودی e را برابر true قرار دهیم که به صورت پیشفرض برابر false است.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.

cp-codfk

نظرات ثبت شده 16 دیدگاه

    1. محمد کاربر مهمان گفت:

      sبا سلام و خسته نباشید
      میخواستم بدونم اگر به عنوان مثال بخواهم کلید میانبر Ctrl + E + X رو تعریف کنیم چه کدی باید بنویسم.
      آخه از روش بالا که انجام دادم جواب نداد.
      ممنون میشوم اگه راهنمایی بفرمایید.

      20
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام؛ از اینجور ترکیب بندی بایستی استفاده کنین
        کنترل + شیفت + حرف
        آلت + کنترل + حرف
        و …
        یعنی دوتای اولی بایستی کلیدهای کنترل، آلت و شیفت باشه

        1. محمد کاربر مهمان گفت:

          با سلام مجدد
          ولی خب اگه اینجوری هست که میفرمایید چرا توی یه نرم افزاری مثله ویژوال استودیو ، به عنوان مثال کلید ترکیبی Ctrl + K + D برای مرتب سازی کد ها وجود داره؟

          00
          1. هادی اکبرزاده مدیر سایت گفت:

            منظورم این نبود که نمیشه اینکارو انجام داد؛ بلکه این اشکال روش بالا در استفاده از متد ProcessCmdKey بود
            همچنین به این نکته توجه کنین که Ctrl + K + D همزمان فشار داده نمیشن! بلکه Ctrl نگه داشته میشه و سپس K و D به ترتیب فشرده و رها میشن
            اگه از رویداد KeyDown فرم به جای متد ProcessCmdKey استفاده کنیم، بازم همینطوره (به انتهای مطلب اضافه شد)
            درواقع کلیدهای Ctrl, Alt, Shift رو میشه به صورت فشرده شده با کلیدای دیگه بررسی کرد ولی کلیدهای دیگه رو نمیشه.

            برای اینکه شما بتونین با کلیدهای دیگه هم همانند Ctrl, Alt, Shift رفتار کنین، بایستی رویدادهای KeyDown و KeyUp رو در ترکیب با همدیگه استفاده کنین

    2. sajjad کاربر مهمان گفت:

      سلام خسته نباشید
      اگه بخوام که کلیدهای ترکیبی زیر رو درست کنم چیکار کنم؟
      F1 + 5
      کلی سرچ کردم ولی چیزی پیدا نکردم
      ممنون میشم کمک کنید

      30
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام دوست من؛ این کلیدهارو نمیشه با دو روش بالا پیاده‌سازی کرد. تو کامنت قبلی هم به اون یکی دوستمون گفتم!
        باید با ترکیب دو رویداد KeyDown و KeyUp، این مورد رو حل کنین. (البته منطق شورتکات‌ها اینه که سه کلید کنترلی Ctrl و Alt و Shift با بقیه ترکیب شن نه کلیدای دیگه)
        در صورتی که موفق به انجامش نشدین اطلاع بدین تا مطلبی رو در این زمینه منتشر کنم.
        موفق باشین

        1. MOSTAFA کاربر مهمان گفت:

          سلام منم میخوام هر فرم کلید تابعی خودم رو تعریف کنم یا کلید 25 فرم 1 باز بشه با کلید 2a فرم 2 باز بشه به همین ترتیب اگه زحمت بکشید کدی معرفی کنید ممنون میشم

          20
        2. MOSTAFA کاربر مهمان گفت:

          سلام هرکاری کردم نشد میشه اموزشی بزارید ممنون

          10
    3. MOSTAFA کاربر مهمان گفت:

      سلام من میخوام در فرم اصلی وقتی دکمه های میانبر رو میزنم فرم مد نظرم باز بشه مثلا کلید عدد 25 و میزنم فرم 1 باز بشه وقتی کلید 2a میزنم فرم 2 کلید 6c میزنم فرم 3 به همین ترتیب میخوام کلید برای فرم های مدنظرم تعریف کنم با یک حرف میتونم باز کنم ولی با دو حرف نشد در ضمن از کلیدهای Ctrl , Alt ,Shift نمیخوام استفاده گنم فقط از اعداد رقمی 10 تا 99 و ترکیبشون با حروف مثل 2a , 3b 4a 8k 9m و غیره ……

      00
      1. هادی اکبرزاده مدیر سایت گفت:

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

        1. MOSTAFA کاربر مهمان گفت:

          بازم سلام نمونه ایی تو vb.net یا c# دارید حرفتون بهتر متوجه بشم ممنون خیلی به این مورد نیاز دارم

          10
          1. هادی اکبرزاده مدیر سایت گفت:

            درود. در صورت تمایل وارد سایت شده و تیکت بدید تا پروژه رو واستون انجام بدیم.

        2. MOSTAFA کاربر مهمان گفت:

          سلام نشد من اینو نوشتم ولی هرکار میکنم نمیشه

          Public Class Form1
              Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
                  Dim q As Queue(Of Integer) = New Queue(Of Integer)()
                  q.Enqueue(25)
                  q.Enqueue(26)
                  For Each element As Integer In q
                      If element = 25 Then
                          Form2.Show()
                          If element = 26 Then
                              Form3.Show()
          
                          End If
                      End If
                  Next
              End Sub
          End Class
          
          30
      2. MOSTAFA کاربر مهمان گفت:
        Imports System.Reactive.Linq
        
        
        Public Class Main
            Protected Overrides Sub OnLoad(ByVal e As EventArgs)
                MyBase.OnLoad(e)
        
                Dim factories = New Dictionary(Of String, Func(Of Form))() From
                    {
                        {"25", Function() New Form1()},
                        {"2a", Function() New Form2()}
                    }
        
                _subscription =
                    Observable.
                        FromEventPattern(Of KeyPressEventHandler, KeyPressEventArgs)(
                            Sub(h) AddHandler Me.KeyPress, h,
                            Sub(h) RemoveHandler Me.KeyPress, h).
                        Buffer(2).
                        Select(Function(x) New String(x.[Select](Function(y) y.EventArgs.KeyChar).ToArray())).
                        Where(Function(x) factories.ContainsKey(x)).
                        ObserveOn(Me).
                        Select(Function(x) factories(x).Invoke()).
                        Subscribe(Sub(f) f.Show())
            End Sub
        
            Private _subscription As IDisposable = Nothing
        
            Private Sub Main_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
                Call _subscription.Dispose()
        
            End Sub
        

        بازم کار نکرد

        00
    4. خودم کاربر مهمان گفت:

      واقعا بیسوادی
      نمیشه که KEYDOWN رو بجای متد processcmdkey بکار برد
      متاسفم برای برنامه نویس ایرانی

      22
      1. هادی اکبرزاده مدیر سایت گفت:

        ما جایی نگفتیم میشه بجای فلان متد، از متد دیگه‌ای برای هر هدفی استفاده کرد! هدف ما اینجا ساخت کلید میانبوره و دو تا از راه‌حل‌هاشو گفتیم. استفاده از متد ProcessCmdKey یا رویداد KeyDown فرم! نگفتیم که این دو متد عین هم هستن!
        وقتی ادعایی دارید بایستی بیشتر توضیح بدید نمیشه که یه حرف بی‌پایه و اساسی بزنیم و با یه ایمیل فیک از صحنه فرار کنیم!

        پ.ن: هر شخصی چه برنامه‌نویس (حتی حرفه‌ای) چه یکی دیگه، احتمال خطا از سمتش وجود داره؛ چه ما که این مطلب رو سال 94 منتشر کردیم و الآن سال 1400 هستش! بهتره وقتی خطایی هم از کسی دیدیم، با درست حرف زدن اون خطارو بهش متذکر بشیم! متاسفم برای برنامه نویس ایرانی که بلد نیست درست حرف بزنه و اینطور به یه شخصی که هدف خیری داره حمله‌ور میشه!

توضیحات پیشنهادی نظرات اشتراک