আমি কীভাবে প্রোগ্রামে সি # তে কীপ্রেস ইভেন্টগুলি উত্পন্ন করতে পারি?


107

আমি কীভাবে প্রোগ্রামিয়ালি এমন একটি ইভেন্ট তৈরি করতে পারি যা কী-বোর্ডে চাপানো কোনও কী অনুকরণ করে?


6
আপনার কি কেবল অনুষ্ঠানটি চালানোর দরকার আছে?
ড্যানিয়েল এ। হোয়াইট

আমি মনে করি একটি 'আসল' কীপ্রেস অনুকরণ করার জন্য আপনাকে নিয়ন্ত্রণহীন কোডে যেতে হবে।
জোনাস বি

হ্যাঁ, অনুষ্ঠানটি চালানো দরকার need
ড্যান ভোগেল

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

6
@ এডস: প্রশ্নটি বেশ সুন্দর ছিল। আমি কীপ্যাড তৈরির বিষয়ে প্রচুর অতিরিক্ত বিশদ যুক্ত করতে পারতাম এবং এখনও একই উত্তর পেয়েছি। আমার যা প্রয়োজন ঠিক তা পেয়েছিলাম তা বিবেচনা করে আমার কাছে এটি "দুর্বল মানের" প্রশ্নের মতো মনে হয় না।
ড্যান ভোগেল

উত্তর:


147

প্রশ্নটি ডাব্লুপিএফ ট্যাগ করা আছে তবে এখনও পর্যন্ত উত্তরগুলি নির্দিষ্ট উইনফোর্স এবং উইন 32।

ডাব্লুপিএফ-এ এটি করার জন্য, কেবলমাত্র একটি কীভেন্টআর্গগুলি তৈরি করুন এবং লক্ষ্যবস্তুতে রাইসইভেন্টকে কল করুন। উদাহরণস্বরূপ, সন্নিবেশ কী কীডাউন ইভেন্টটি বর্তমানে মনোনিবেশ করা উপাদানটিতে পাঠাতে:

  var key = Key.Insert;                    // Key to send
  var target = Keyboard.FocusedElement;    // Target element
  var routedEvent = Keyboard.KeyDownEvent; // Event to send

  target.RaiseEvent(
    new KeyEventArgs(
      Keyboard.PrimaryDevice,
      PresentationSource.FromVisual(target),
      0,
      key)
    { RoutedEvent=routedEvent }
  );

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

মনে রাখবেন যে এই কোডটি কেবলমাত্র প্রিভিউকিডাউন, কীডাউন, প্রিভিউকিউইউপি এবং কীআপ ইভেন্টগুলিতে প্রযোজ্য। আপনি যদি পাঠ্য ইনপুট ইভেন্টগুলি প্রেরণ করতে চান তবে আপনি এটি পরিবর্তে এটি করবেন:

  var text = "Hello";
  var target = Keyboard.FocusedElement;
  var routedEvent = TextCompositionManager.TextInputEvent;

  target.RaiseEvent(
    new TextCompositionEventArgs(
      InputManager.Current.PrimaryKeyboardDevice,
      new TextComposition(InputManager.Current, target, text))
    { RoutedEvent = routedEvent }
  );

এটিও নোট করুন:

  • নিয়ন্ত্রণগুলি পূর্বরূপ ইভেন্টগুলি পাওয়ার প্রত্যাশা করে, উদাহরণস্বরূপ, প্রাকদর্শন কীডাউন কি-ডাউনের আগে হওয়া উচিত

  • টার্গেট.রোসইভেন্ট (...) ব্যবহার করে মেটা-প্রসেসিং যেমন এক্সিলারেটর, পাঠ্য রচনা এবং আইএমই ছাড়াই ইভেন্টটিকে সরাসরি লক্ষ্যতে প্রেরণ করে। এটি সাধারণত আপনি চান অন্যদিকে, যদি আপনি কোনও কারণে প্রকৃত কীবোর্ড কীগুলি অনুকরণ করতে সত্যিই করেন তবে আপনি পরিবর্তে ইনপুটম্যানেজার.প্রসেসইনপুট () ব্যবহার করবেন।


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

24
আমি যখন কীডাউন এর প্রথম কোডটি চেষ্টা করেছিলাম তখন "লক্ষ্য" এ ত্রুটি পেয়েছিলাম কেন এটি চাক্ষুষে রূপান্তর করতে পারে না?
কর্টাল

3
ড্যান, আপনি কীভাবে কোনও সংশোধক (সিটিআরএল / ওএল / শিফট) দিয়ে কী টিপুন তা অনুকরণ করতে জানেন? বিশদ বিবরণ আমার ইনপুটবাইন্ডিং অনুকরণ করা প্রয়োজন: m_shell.InputBindings.Ad (নতুন কী বাইন্ডিং (এম_কম্যান্ড, কী.ইনসেট, ModifierKeys.Control | ModifierKeys.Alt));
শ্রিক

14
আমাদের সম্পর্কে লক্ষ্য ইস্যু, আমি এটা ব্যবহার করে কাজ Keyboard.PrimaryDevice.ActiveSourceদেখুন stackoverflow.com/questions/10820990/...
OscarRyz

4
এই উত্তরটি খুব ভাল, তবে এটি একটি পরিবর্তনকারী সহ একটি কী পাঠাতে ব্যবহার করা যাবে না, যেমনটি @ শ্রিক জানিয়েছেন। ( Ctrl+C
উদা

28

উইন্ডোজ ফর্ম প্রসঙ্গ ছাড়াই মূল ইভেন্টগুলি তৈরি করতে, আমরা নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারি,

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

নমুনা কোড নীচে দেওয়া হয়েছে:

const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28;  //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
    //Press the key
    keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
    return 0;
}

ভার্চুয়াল কীগুলির তালিকা এখানে সংজ্ঞায়িত করা হয়েছে

সম্পূর্ণ ছবি পেতে, দয়া করে নীচের লিঙ্কটি ব্যবহার করুন, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html


আপনার উইন্ডোটি শীর্ষে থাকলে উপযুক্ত। এটি আমার পরিস্থিতি আংশিক সমাধান করেছে, ধন্যবাদ!
সের্গেই

রাজেশের উত্তরের একটি সংযোজন, আপনি যদি মোবাইল প্ল্যাটফর্মে এটি করতে চান তবে আপনাকে অবশ্যই "coredll.ddl"
ব্যবহারকারী 01123236

22

আমি এটি ব্যবহার করি নি, তবে সেন্ডকি আপনি যা চান তা করতে পারে।

সক্রিয় অ্যাপ্লিকেশনে কীস্ট্রোক এবং কীস্ট্রোক সংমিশ্রণ প্রেরণের জন্য সেন্ডকি ব্যবহার করুন। এই শ্রেণিটি তাত্ক্ষণিকভাবে চালু করা যায় না। কোনও ক্লাসে কীস্ট্রোক প্রেরণ এবং অবিলম্বে আপনার প্রোগ্রামের প্রবাহটি চালিয়ে যেতে, প্রেরণটি ব্যবহার করুন use কীস্ট্রোক দ্বারা শুরু হওয়া কোনও প্রক্রিয়াটির জন্য অপেক্ষা করতে, সেন্ডওয়েট ব্যবহার করুন।

System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");

মাইক্রোসফ্টের এখানে আরও কয়েকটি ব্যবহারের উদাহরণ রয়েছে


3
আমি সেন্ডকিস ব্যবহার করার চেষ্টা করেছি। পাঠান এবং আমি এই অবৈধপ্রকাশের অভিজ্ঞতাটি পেয়েছি: "অ্যাপ্লিকেশনটিতে উইন্ডোজ বার্তাগুলি পরিচালনা করছে না বলে এই অ্যাপ্লিকেশনটির মধ্যে সেন্ডকিগুলি চলতে পারে না messages সেন্ডকি.সেন্ডওয়েট ব্যবহারের কোনও প্রভাব নেই।
ড্যান ভোগেল

আপনি কী ইভেন্টটি নিজের কাছে প্রেরণ করছেন না তা নিশ্চিত করুন। ইভেন্টটি প্রেরণের আগে যথাযথ প্রক্রিয়াতে ফোকাস পরিবর্তন করুন। দ্বিতীয় লিঙ্কযুক্ত নিবন্ধটি এতে কিছুটা সহায়তা রয়েছে।
মাইকেল পেট্রোটা 20

11

সহজে! (কারণ ইতিমধ্যে অন্য কেউ আমাদের জন্য কাজটি করেছে ...)

প্রস্তাবিত উত্তরগুলির সাথে এটির জন্য প্রচুর সময় ব্যয় করার পরে আমি এই কোডপ্লেক্স প্রকল্পটি উইন্ডোজ ইনপুট সিমুলেটর জুড়ে এসেছি যা একটি মূল প্রেসের অনুকরণ করার জন্য এটি সহজ করে তুলেছিল :

  1. প্যাকেজটি ইনস্টল করুন, সম্পন্ন করা যেতে পারে বা নিউগেট প্যাকেজ ম্যানেজার বা প্যাকেজ ম্যানেজার কনসোল থেকে যেমন:

    ইনস্টল-প্যাকেজ ইনপুটসিমুলেটর

  2. এই 2 লাইন কোড ব্যবহার করুন:

    inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)

এবং এটাই!

------- সম্পাদনা --------

Codeplex উপর প্রকল্প পাতা কোনো কারণে পতাকাঙ্কিত করা হয়, এই NuGet গ্যালারি লিংক।


এটি খুব ভালভাবে কাজ করে, তবে কীগুলির সংমিশ্রণে এই কাজটি কীভাবে করা যায় তা আমি সন্ধান করতে সক্ষম
হইনি

যখন আপনি কীগুলির সংমিশ্রণটি বলতে চান আপনি কি CTRL-C এর মতো বোঝায়?
রভিড গোল্ডেনবার্গ

হ্যাঁ বা এমনকি আপনি যদি পূর্ণ পর্দায় যেতে কনসোল অ্যাপ্লিকেশন চেয়েছিলেন যেমন আল্ট-এন্টার, আমি জানি আপনি পূর্ণ স্ক্রিনে প্রবেশ করতে F11 ব্যবহার করতে পারেন তবে অল্ট-এন্টার কাজ করবে কিনা তা দেখতে ভাল লাগবে :)
ব্যবহারকারীর 1234433222

1
ঠিক আছে আপনি এটি করতে পারেন, যদিও আমি এটি চেষ্টা করে দেখিনি, কেবল ইনপুটসিমুলেটর.কায়ারবোর্ড.মোডিফাইডকি স্ট্রোক (ভার্চুয়ালকি কোডস.কন্ট্রোল, ভার্চুয়ালকিপি কোড.ভি কে_সি) ব্যবহার করুন;
রভিড গোল্ডেনবার্গ

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