বর্তমানে চাপা কীটি কীভাবে সনাক্ত করবেন?


123

ইন উইন্ডোজ ফরম , আপনি যে কোনো সময়ে, জানতে পারি, এর কার্সার ধন্যবাদ বর্তমান অবস্থান এক্সিকিউটেবল-এর পাথ শ্রেণী।

একই জিনিসটি কীবোর্ডের জন্য উপলব্ধ বলে মনে হচ্ছে না। উদাহরণস্বরূপ, Shiftকীটি টিপানো হয়েছে কিনা তা জানা সম্ভব ?

প্রতিটি কীবোর্ড বিজ্ঞপ্তি (কীডাউন এবং কীআপ ইভেন্টগুলি) সন্ধান করা একেবারে প্রয়োজনীয়?


আপনি কি ডাব্লুপিএফ পরিবেশে কাজ করছেন বা অন্য কিছু?
এপোটটার

70
@ পোটার: দ্বিতীয় শব্দটিতে উইনফোর্ডস লেখা আছে।
উইল এডিনস

উত্তর:


162
if ((Control.ModifierKeys & Keys.Shift) != 0) 

Ctrl+ Shiftডাউন থাকলে এটিও সত্য হবে । আপনি যদি শিফটটি একা চাপছেন কিনা তা পরীক্ষা করতে চান,

if (Control.ModifierKeys == Keys.Shift)

যদি আপনি এমন কোনও শ্রেণিতে থাকেন যা উত্তরাধিকার সূত্রে আসে Control(যেমন একটি ফর্ম), আপনি এইটি সরাতে পারেনControl.


8
আমি যদি কিছু মিস করি না তবে আপনি প্রশ্নের সঠিক উত্তর দেননি। ওপি সমস্ত কী সম্পর্কে জিজ্ঞাসা করছে এবং শিফট কীটি কেবল উদাহরণ হিসাবে ব্যবহার করেছে। সুতরাং আপনি কী কীভাবে অন্যান্য কীগুলি সনাক্ত করতে পারেন যেমন A থেকে Z, 0 থেকে 9 ইত্যাদি
অ্যাশ

2
এই উত্তরটি তিনি গ্রহণ করেছেন বলে মনে হচ্ছে, তার কেবলমাত্র পরিবর্তক কীগুলি প্রয়োজন। আপনি যদি অন্য কীগুলি চান তবে আপনাকে GetKeyStateAPI ফাংশনটি কল করতে হবে ।
স্ল্যাকস

2
গেটকিস্টেটের দরকার নেই। আপনাকে কেবল একটি বার্তা ফিল্টার যুক্ত করতে হবে। আমার উত্তর দেখুন।
অ্যাশ

2
একটি জন্য WPF সমাধান আপনি ব্যবহার করতে পারেন Keyboard.Modifiers == ModifierKeys.Shift (যাদের একটি অনুসন্ধানে এখানে এসেছে জন্য)
বিল Tarbell

3
এর পরিবর্তে যে (Control.ModifierKeys & Keys.Shift) != 0Control.ModifierKeys.HasFlag(Keys.Shift)
কোনওটি

55

নীচের কোডটি কীভাবে কেবল Shiftকীটি নয়, প্রায় সমস্ত চাপিত কীগুলি সনাক্ত করতে পারে ।

private KeyMessageFilter m_filter = new KeyMessageFilter();

private void Form1_Load(object sender, EventArgs e)
{
    Application.AddMessageFilter(m_filter);
}


public class KeyMessageFilter : IMessageFilter
{
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;
    private bool m_keyPressed = false;

    private Dictionary<Keys, bool> m_keyTable = new Dictionary<Keys, bool>();

    public Dictionary<Keys, bool> KeyTable
    {
        get { return m_keyTable; }
        private set { m_keyTable = value; }
    }

    public bool IsKeyPressed()
    {
        return m_keyPressed;
    }

    public bool IsKeyPressed(Keys k)
    {
        bool pressed = false;

        if (KeyTable.TryGetValue(k, out pressed))
        {
            return pressed;
        }

        return false;
    }

    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_KEYDOWN)
        {
            KeyTable[(Keys)m.WParam] = true;

            m_keyPressed = true;
        }

        if (m.Msg == WM_KEYUP)
        {
            KeyTable[(Keys)m.WParam] = false;

            m_keyPressed = false;
        }

        return false;
    }
}

1
GetKeyStateআরও দক্ষ হবে। উইন্ডোজ যখন ইতিমধ্যে এটি আপনার জন্য করে তখন সমস্ত কীগুলি সন্ধান করার কোনও মানে হয় না।
স্ল্যাक्स

3
@ স্ল্যাকস, আপনার যদি কিছু বেঞ্চমার্ক ডেটা না থাকে তবে আপনি অনুমান করছেন। তাছাড়া GetKeyState আপনি, একটি কী রাজ্যের বলব যদি আপনি যা করতে পারেন ফাঁদ যে প্রথম স্থানে কীবোর্ড ইভেন্ট। আমার প্রশ্নের পাঠটি হ'ল ওপি যে কোনও সময় কী কী অবস্থা পেতে পারে তা জানতে চায় । সুতরাং নিজে থেকে গেটকি স্টেট অকেজো।
অ্যাশ

3
কীগুলি টিপছে তা দেখানোর জন্য আপনি কীভাবে এটি ব্যবহার করবেন?
গ্যাব্রিয়েল রায়ান নাহমিয়াস

গ্যাব্রিয়েল: আপনার ফর্মের ক্ষেত্র হিসাবে কীমেসেজফিল্টারের একটি উদাহরণ তৈরি করুন। এটিকে অ্যাপ্লিকেশনটিতে দিন Form ফর্ম_লডে অ্যাডমেসেজফিল্টার ()। তারপরে আপনার আগ্রহী প্রতিটি / যে কোনও কীটির জন্য এই উদাহরণে ইসকেপ্রেসড () কে কল করুন
অ্যাশ

@ আপনার উত্তরের জন্য ধন্যবাদ - আপনি কি উপরের শিফট কী ইত্যাদি পরীক্ষা করার জন্য একটি কোড উদাহরণ করতে সক্ষম হবেন?
বিকেএসপুরজন 21

23

আপনি যদি সিস্টেমটি উল্লেখ করেন তবে নিম্নলিখিতগুলিও দেখতে পারেন ind উইন্ডোজ I ইনপুট

if (Keyboard.Modifiers == ModifierKeys.Shift)

কীবোর্ড.আইসকিডাউন (কী) এর সাহায্যে অন্যান্য কীগুলির চাপা স্থিতি পরীক্ষা করতে কীবোর্ডের নেমস্পেসটি ব্যবহার করা যেতে পারে, বা আপনি যদি কোনও কীডাউনএভেন্ট বা অনুরূপ ইভেন্টের সদস্যতা নিচ্ছেন তবে ইভেন্ট আর্গুমেন্টগুলি বর্তমানে চাপা কীগুলির একটি তালিকা বহন করে।


1
আসলে কীবোর্ড.মোডিফায়ারগুলি সর্বদা সঠিকভাবে কাজ করে না। কঠিন
পথটি

এটি ফর্ম সংশোধক ব্যবহার না করে, System.Windows. ইনপুট পরিবর্তনকারীগুলি একটি ভিন্ন নেমস্পেস এবং প্রতিবার আমাদের জন্য দুর্দান্ত কাজ করেছে।
জেফ ওয়াইন

18

এই উত্তরগুলির বেশিরভাগই বেশ জটিল বা আমার পক্ষে কাজ করে না বলে মনে হয় (যেমন: সিস্টেম. উইন্ডোজ n ইনপুট উপস্থিত বলে মনে হয় না)। তারপরে আমি কিছু নমুনা কোড পেয়েছি যা সূক্ষ্মভাবে কাজ করে: http://www.switchonthecode.com / টিউটোরিয়ালস / উইনফরমসেস -অ্যাকসেসিং- মাউস- এবং- কী-বোর্ড-স্টেট

ভবিষ্যতে পৃষ্ঠাটি অদৃশ্য হয়ে যাওয়ার ক্ষেত্রে আমি নীচে সম্পর্কিত উত্স কোডটি পোস্ট করছি:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MouseKeyboardStateTest
{
  public abstract class Keyboard
  {
    [Flags]
    private enum KeyStates
    {
      None = 0,
      Down = 1,
      Toggled = 2
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern short GetKeyState(int keyCode);

    private static KeyStates GetKeyState(Keys key)
    {
      KeyStates state = KeyStates.None;

      short retVal = GetKeyState((int)key);

      //If the high-order bit is 1, the key is down
      //otherwise, it is up.
      if ((retVal & 0x8000) == 0x8000)
        state |= KeyStates.Down;

      //If the low-order bit is 1, the key is toggled.
      if ((retVal & 1) == 1)
        state |= KeyStates.Toggled;

      return state;
    }

    public static bool IsKeyDown(Keys key)
    { 
      return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
    }

    public static bool IsKeyToggled(Keys key)
    { 
      return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
    }
  }
}

3
System.Windows.Inputবিদ্যমান; অন্যদের জন্য এটির জন্য লড়াই করার জন্য আপনার একটি রেফারেন্স PresentationCoreএবং গণনা WindowsBaseঅ্যাক্সেস করার জন্য একটি অতিরিক্ত রেফারেন্স যুক্ত করতে হবে System.Windows.Input.Key। এই তথ্যটি সর্বদা এমএসডিএন-তে পাওয়া যায়।
অ্যালফি

1
এই ক্লাসটি হবে staticনা, অনুমিত হয় abstract
ছোট এন্ডিয়ান

1
লিঙ্কটি ভেঙে গেছে (404)।
পিটার মর্টেনসেন

2
"ভবিষ্যতে পৃষ্ঠাটি অদৃশ্য হয়ে গেলে আমি নীচে প্রাসঙ্গিক উত্স কোড পোস্ট করছি"
পার্সলে 72

12

.NET ফ্রেমওয়ার্ক সংস্করণ 3.0, যেহেতু Keyboard.IsKeyDownনতুন System.Windows.Inputনামস্থান থেকে পদ্ধতিটি ব্যবহার করা সম্ভব । এই ক্ষেত্রে:

if (((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) && Keyboard.IsKeyDown(Key.F))
{
    // CTRL + F is currently pressed
}

যদিও এটি ডাব্লুপিএফের অংশ, তবুও উইনফর্ম অ্যাপ্লিকেশনগুলির জন্য (পদ্ধতিটি আপনি প্রেজেন্টেশন কোর.ডিল এবং উইন্ডোজবেস.ডিএল- তে উল্লেখ যুক্ত করেছেন ) সেই পদ্ধতিটি দুর্দান্ত কাজ করে । দুর্ভাগ্যক্রমে, তবে, Keyboard.IsKeyDownপদ্ধতির 3.0 এবং 3.5 সংস্করণ উইনফর্ম অ্যাপ্লিকেশনগুলির জন্য কাজ করে না। অতএব, আপনি যদি এটি কোনও উইনফর্ম অ্যাপ্লিকেশনটিতে ব্যবহার করতে চান তবে এটি কাজ করার জন্য আপনাকে নেট। ফ্রেমওয়ার্ক 4.0 বা তার পরে লক্ষ্য করা দরকার target


কেবল একটি নোট, এটি কেবল ডাব্লুপিএফের জন্য
ডিয়েগো ভিয়েরা

2
@ ডিগো ভিইরা আসলে এটি সত্য নয়। কার্যকারিতা ডাব্লুপিএফের অংশ হিসাবে যুক্ত করা হয়েছিল এবং এর জন্য প্রয়োজন যে এই ডাব্লুপিএফ লাইব্রেরিগুলি উল্লেখ করা যেতে পারে, তবে Keyboard.IsKeyDownপদ্ধতিটি উইনফর্ম প্রকল্পেও কাজ করে।
স্টিভেন ডগগার্ট

প্রকৃতপক্ষে, আপনাকে প্রেজেন্টেশনকোর.ডিল যুক্ত করতে হবে
ডিয়েগো ভিয়েরা

2
উল্লেখ্য এই Win32KeyboardDevice.GetKeyStatesFromSystem (কী) বাস্তবায়নে পরিবর্তনের কারণে না কাজ (WinForms মধ্যে) যদি লক্ষ্য করে নেট 3.5 বা তার আগে, শুধুমাত্র 4.0+, :(
LMK

@ এলএমকে ভাল লাগছে আমি নিজে এটি পরীক্ষা করেছি এবং আপনি যা বলেছিলেন তা যাচাই করেছি। আমি সেই তথ্যটি প্রতিবিম্বিত করতে আমার উত্তর আপডেট করেছি। ধন্যবাদ!
স্টিভেন ডগগার্ট

8

আপনি পি / ডাকা Win32 নিচে GetAsyncKeyState কীবোর্ডে যে কোনো একটি কি পরীক্ষা করা হবে।

আপনি এই ফাংশনে কী এনম (উদাহরণস্বরূপ কী। শিফট) থেকে মানগুলিতে পাস করতে পারেন, সুতরাং এটি যুক্ত করতে কেবল কয়েক লাইন কোডের প্রয়োজন।


Keyboardসংকলক দ্বারা স্বীকৃত ছিল না, তবে GetAsyncKeystateব্যবহারকারী 32 এ ঠিকঠাক কাজ করেছে। ধন্যবাদ!
আইনস্টাইন এক্স। রহস্য


3

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

public frmForm()
{
    // ...
    frmForm.KeyPreview = true;
    // ...
}

তারপরে ফর্মের _কিডাউন, _কিপ্রেস এবং / অথবা _ কী আপ ইভেন্টগুলি ইনপুট ইভেন্টগুলিতে অ্যাক্সেসের জন্য মার্শেল করা যেতে পারে ফোকাসযুক্ত ফর্ম নিয়ন্ত্রণটি দেখার আগে এবং আপনি সেখানে ইভেন্টটি ক্যাপচার করতে হ্যান্ডলার যুক্তি প্রয়োগ করতে পারেন বা ফোকাস ফর্ম নিয়ন্ত্রণের মধ্য দিয়ে যেতে পারেন ।

যদিও এক্সএএমএল-এর ইভেন্ট-রুটিং আর্কিটেকচারের মতো কাঠামোগতভাবে মনোমুগ্ধকর নয়, এটি উইনফর্মগুলিতে ফর্ম-স্তরের ফাংশনগুলির পরিচালনাকে আরও সহজ করে তোলে। ক্যাভ্যাটগুলির জন্য কীপ্রিভিউতে এমএসডিএন নোটগুলি দেখুন ।


2
if (Form.ModifierKeys == Keys.Shift)

উপরের কোডটি ফর্মের কীডাউন ইভেন্টে থাকলে এবং কী-ডাউন করার জন্য কীডাউন ইভেন্টটি অন্য কোনও নিয়ন্ত্রণ না নিলে কোনও পাঠ্য বাক্সের জন্য কাজ করে।

এছাড়াও কেউ এর সাথে আরও কী প্রসেসিং বন্ধ করতে চান:

e.Handled = true;

2
if (Control.ModifierKeys == Keys.Shift)
    //Shift is pressed

কার্সার এক্স / ওয়াই পজিশন একটি সম্পত্তি, এবং একটি কী (চাপ হিসাবে / মাউস ক্লিক / মাউসওয়েভ) একটি ইভেন্ট। সেরা অনুশীলন সাধারণত ইন্টারফেস ইভেন্ট চালিত হতে দেওয়া হয়। আপনি যদি একটি শিফট + মাউস ক্লিক ক্লিক করার চেষ্টা করছেন তবে উপরের প্রয়োজনটি কেবলমাত্র তখনই।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.