উইন্ডোজ ফর্ম অ্যাপ্লিকেশনটিতে কীবোর্ড শর্টকাটগুলি প্রয়োগ করার সর্বোত্তম উপায়?


280

আমি সি উইন্ডোতে আমার উইন্ডোজ ফর্ম অ্যাপ্লিকেশনগুলিতে সাধারণ উইন্ডোজ কীবোর্ড শর্টকাটগুলি (উদাহরণস্বরূপ Ctrl+ F, Ctrl+ N) বাস্তবায়নের জন্য সেরা পদ্ধতির সন্ধান করছি ।

অ্যাপ্লিকেশনটির একটি মূল ফর্ম রয়েছে যা অনেকগুলি শিশু ফর্ম হোস্ট করে (একবারে একটি করে)। যখন কোনও ব্যবহারকারী Ctrl+ আঘাত করে F, আমি একটি কাস্টম অনুসন্ধান ফর্মটি প্রদর্শন করতে চাই। অনুসন্ধান ফর্মটি অ্যাপ্লিকেশনের বর্তমান ওপেন চাইল্ড ফর্মের উপর নির্ভর করবে।

চাইল্ডফর্ম_কিডাউন ইভেন্টে আমি এরকম কিছু ব্যবহার করার কথা ভাবছিলাম :

   if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control)
        // Show search form

তবে এটি কাজ করে না। আপনি কোনও কী টিপলে ইভেন্টটিও আগুনে না। সমাধান কি?


এটা সত্যিই আশ্চর্যজনক যে উইন্ডোফর্মগুলির কাছে এর জন্য নির্দিষ্ট উইন্ডোজ এপিআইয়ের মতো নির্দিষ্ট কার্যকারিতা নেই বলে মনে হয়।
স্টুয়ার্ট

উত্তর:


460

আপনি সম্ভবত ফর্মের কীপ্রিভিউ সম্পত্তিটি সত্য হিসাবে সেট করতে ভুলে গেছেন । উপেক্ষা করা ProcessCmdKey () পদ্ধতি জেনেরিক সমাধান:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == (Keys.Control | Keys.F)) {
    MessageBox.Show("What the Ctrl+F?");
    return true;
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

এটি ভালভাবে কাজ করে তবে ফর্মটি সক্রিয় উইন্ডো হলে কেবল এটিই আমার জন্য এটি সনাক্ত করে। যে কেউ এটি কীভাবে বাঁধতে জানেন যে কোনও উইন্ডো ভিউতে এটি সম্ভব?
গা

কিছু পরিস্থিতিতে KeyPreviewবেশ অপরিহার্য। উদাহরণস্বরূপ, একটি শর্টকাট টিপানোর সময় ইনপুট দমন করা প্রয়োজন তবে তবুও একটি পৃথক MenuStripইভেন্টকে আগুন জ্বলতে দেয়। ProcessCmdKeyপদ্ধতির ঘটনা ফায়ারিং যুক্তির সদৃশ হবে।
শৌল

1
হুম, না, ফর্মের কীডাউন ইভেন্ট হ্যান্ডলারটি একটি মেনু আইটেমের ক্লিক ইভেন্ট হ্যান্ডলার থেকে আলাদা। আপনি এখনও ঠিক একইভাবে করেন, হয় ইভেন্ট হ্যান্ডলার পদ্ধতিটিকে সরাসরি কল করুন (এটির দ্বারা কোনও ইভেন্ট দ্বারা একচেটিয়াভাবে ডাকার প্রয়োজন নেই) অথবা সাধারণ যুক্তিকে একটি পৃথক পদ্ধতিতে রিফ্যাক্টর করুন।
হ্যানস প্যাস্যান্ট

14
"Ctrl + F কি?" LOL
kchad

73

আপনার মূল ফর্ম

  1. সেট KeyPreviewসত্যতে
  2. নিম্নলিখিত কোড সহ কীডাউন ইভেন্ট হ্যান্ডলার যুক্ত করুন

    private void MainForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.N)
        {
            SearchForm searchForm = new SearchForm();
            searchForm.Show();
        }
    }
    

4
+ এর জন্য, কী-প্রিভিউটিকে সত্যে সেট করুন .. অনুপস্থিত ছিল
উসমান ইউনাস

20

সর্বোত্তম উপায় হ'ল মেনু মিমোনমিক্স ব্যবহার করা, অর্থাৎ আপনার মূল ফর্মটিতে মেনু এন্ট্রি থাকা যা আপনার পছন্দ মতো কীবোর্ড শর্টকাট বরাদ্দ করা হয়। তারপরে আর সমস্ত কিছু অভ্যন্তরীণভাবে পরিচালিত হয় এবং আপনাকে যা করতে হবে তা হ'ল Clickমেনু প্রবেশের ইভেন্ট হ্যান্ডলারে কার্যকর হওয়া কার্যকর পদক্ষেপটি কার্যকর করা ।


1
সমস্যাটি হ'ল মূল ফর্মটি সাধারণ উইন্ডো মেনু ব্যবহার করে না। এটি কাস্টম নেভিগেশন প্যানেল ব্যবহার করে যা শিশু ফর্মগুলি দেখানোর জন্য ব্যবহৃত হয়। শিশু ফর্মের টুলস্ট্রিপ বাটনে ক্লিক করে অনুসন্ধানের ফর্মগুলি চাওয়া হয়।
রককোডার

menu mnemonicsআসল নমুনা?
কিকিনেট


1
স্মৃতিশক্তি শর্টকাট কীগুলির থেকে পৃথক ধারণা এবং এগুলি কীভাবে পরিচালনা করে তার মধ্যে গুরুত্বপূর্ণ পার্থক্য রয়েছে। সংক্ষেপে, মিমোনমিক্স হ'ল মেনুগুলি, মেনু কমান্ডগুলি এবং কীবোর্ডটি ব্যবহার করে ডায়লগ নিয়ন্ত্রণগুলি অ্যাক্সেস করতে ব্যবহৃত নিম্নরেখাঙ্কিত অক্ষর। ওটিওএইচ, শর্টকাট কীগুলি মেনুগুলির মধ্যে না গিয়ে কমান্ড অ্যাক্সেসের একটি উপায় এবং তদুপরি সেগুলি Ctrl + F বা F5 এর মতো স্বেচ্ছাসেবী কীস্ট্রোক হতে পারে, অক্ষর কীগুলিতে সীমাবদ্ধ নয়।
স্টুয়ার্ট

1
পছন্দ করুন আমার উত্তরটি বোঝানোর চেষ্টা করছিল না যে সমস্ত কীবোর্ড শর্টকাটগুলি স্মৃতিবিজ্ঞান, কেবল মেনু মিমোনমিক্সই এই কার্যকারিতাটি পাওয়ার সহজতম উপায়। দুর্ভাগ্যক্রমে, রককোডার এর মন্তব্য যেমন স্পষ্ট করেছে, এই সমাধানটি এখানে উপযুক্ত বলে মনে হচ্ছে না। আমি এখনও এটি পছন্দনীয় সমাধান হিসাবে সুপারিশ করছি, যেখানে সম্ভব। একটি সাধারণ সমাধানের জন্য, হান্সের গৃহীত উত্তর হ'ল এগিয়ে যাওয়ার পথ।
কনরাড রুডল্ফ

11

আপনি এই উদাহরণটিও দেখতে পারেন:

public class MDIParent : System.Windows.Forms.Form
{
    public bool NextTab()
    {
         // some code
    }

    public bool PreviousTab()
    {
         // some code
    }

    protected override bool ProcessCmdKey(ref Message message, Keys keys)
    {
        switch (keys)
        {
            case Keys.Control | Keys.Tab:
              {
                NextTab();
                return true;
              }
            case Keys.Control | Keys.Shift | Keys.Tab:
              {
                PreviousTab();
                return true;
              }
        }
        return base.ProcessCmdKey(ref message, keys);
    }
}

public class mySecondForm : System.Windows.Forms.Form
{
    // some code...
}

8

আপনার যদি একটি মেনু থাকে তবে ShortcutKeysসম্পত্তিটি পরিবর্তনের ToolStripMenuItemকৌশলটি করা উচিত।

যদি তা না হয় তবে আপনি একটি তৈরি করতে পারেন এবং এর visibleসম্পত্তিটিকে মিথ্যাতে সেট করতে পারেন ।


না আমার একটি মেনু নেই। অনুসন্ধানের জন্য সরঞ্জামস্ট্রিপবাটনটি আসলে বাইন্ডিংনাভিগেটর নিয়ন্ত্রণে অবস্থিত, সুতরাং মেনু যুক্ত করা সম্ভবত কোনও বিকল্প নয়।
রককোডার

6

মূল ফর্মটি থেকে আপনাকে:

  • আপনি কীপ্রিভিউটিকে সত্যে সেট করেছেন তা নিশ্চিত হয়ে নিন ( সত্যই ডিফল্টরূপে)
  • যোগ MainForm_KeyDown (..) - যা দ্বারা আপনাকে এখানে কোনো শর্টকাট আপনি চান সেট করতে পারেন।

অতিরিক্তভাবে, আমি এটি গুগলে খুঁজে পেয়েছি এবং যারা এখনও উত্তরগুলির সন্ধান করছেন তাদের সাথে আমি এটি ভাগ করে নিতে চেয়েছিলাম। (বিশ্বব্যাপী)

আমি মনে করি আপনি ব্যবহারকারী 32.dll ব্যবহার করা উচিত

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if (m.Msg == 0x0312)
    {
        /* Note that the three lines below are not needed if you only want to register one hotkey.
         * The below lines are useful in case you want to register multiple keys, which you can use a switch with the id as argument, or if you want to know which key/modifier was pressed for some particular reason. */

        Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);                  // The key of the hotkey that was pressed.
        KeyModifier modifier = (KeyModifier)((int)m.LParam & 0xFFFF);       // The modifier of the hotkey that was pressed.
        int id = m.WParam.ToInt32();                                        // The id of the hotkey that was pressed.


        MessageBox.Show("Hotkey has been pressed!");
        // do something
    }
}

আরও এই পড়া http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/


4

এতে নতুন কারও পক্ষে হান্সের উত্তরটি কিছুটা সহজ করা যেতে পারে, সুতরাং এখানে আমার সংস্করণটি রয়েছে।

আপনার সাথে বোকা বানানোর দরকার নেই KeyPreview, এটি সেট করে রেখে দিন false। নীচের কোডটি ব্যবহার করতে, কেবল এটি আপনার নীচে পেস্ট করুন form1_loadএবং F5এটি কাজ করে দেখুন:

protected override void OnKeyPress(KeyPressEventArgs ex)
{
    string xo = ex.KeyChar.ToString();

    if (xo == "q") //You pressed "q" key on the keyboard
    {
        Form2 f2 = new Form2();
        f2.Show();
    }
}

7
প্রথমে, ওভাররাইডিং প্রসেসসিএমডিকি হ'ল কমান্ডের মতো কিছু অপারেশন করার উদ্দেশ্যে কী-স্ট্রোক পরিচালনা করার প্রস্তাবিত উপায়, যা ওপি সম্পর্কে জিজ্ঞাসা করছিল। দ্বিতীয়ত, কীপ্রেভিউকে সত্যে সেট করার বিষয়ে আপনি হান্সের মন্তব্যকে ভুল বুঝেছেন; তিনি কেবল ওপিকে বলছিলেন যে তার কৌশলটি কেন কাজ করছে না। প্রসেসসিএমডিকি ব্যবহারের জন্য কী-প্রিভিউটিকে সত্যে সেট করা প্রয়োজন হয় না।
রেনিপেট

2

উইনফোর্মে, আমরা সর্বদা এর দ্বারা কন্ট্রোল কী স্থিতি পেতে পারি:

bool IsCtrlPressed = (Control.ModifierKeys & Keys.Control) != 0;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.