सी # प्लगइन सिस्टम के साथ टैमिंग हॉटकीज़

हेलो प्यारे बाज!

इस लेख में मैं यह दिखाना चाहता हूं कि कैसे मैंने हॉटकीज़ का उपयोग करके कुछ कार्यों को गति देने और सरल बनाने का कार्यक्रम बनाया।

प्रविष्टि


लगभग डेढ़ महीने पहले, उपयोगकर्ता vvzvlad ने मुझे हॉटकी दबाकर विभिन्न पाठ का अनुवाद करने के लिए एक कार्यक्रम के विचार के लिए प्रेरित किया। मैंने इस कार्यक्रम का उपयोग बहुत लंबे समय के लिए किया था, लेकिन कुछ दिन पहले मुझे इसे सुधारने का विचार आया।
मैंने अलग-अलग क्रियाओं के लिए विभिन्न हॉटकीज़ असाइन करने की क्षमता जोड़ने का फैसला किया। इसके लिए, मैंने एक प्लग-इन सिस्टम का उपयोग किया।
परिणाम HotKeyHelper प्रोग्राम है, जिसे आप यहां डाउनलोड कर सकते हैं

छवि

परियोजना फ़ाइल यहाँ है

कटौती के तहत आप कार्यक्रम के स्रोत कोड और इसके लिए स्पष्टीकरण देखेंगे।


कार्यक्रम



जैसा कि मैंने ऊपर लिखा था, मैंने प्लग-इन सिस्टम का उपयोग करने का निर्णय लिया।

ऐसा करने के लिए, हमें एक प्लगइन इंटरफ़ेस लिखना होगा:

public delegate void PluginHandler(string text); /// <summary> ///     /// </summary> public interface IPlugin { /// <summary> ///   /// </summary> string Name { get; } /// <summary> ///        /// </summary> bool NeedSelectedText { get;} /// <summary> ///    /// </summary> /// <param name="parametres"> </param> /// <param name="text">  </param> void MainMethod(string parametres,string text); event PluginHandler ShowBaloonHandler; event PluginHandler ShowFormHandler; event PluginHandler PasteTextHandler; } 


और प्लगइन्स लोड करने के लिए एक विधि लिखें:

  private void LoadPlugins() { //    string sPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); ; //       .dll foreach (string f in System.IO.Directory.GetFiles(sPath, "*.dll")) { System.Reflection.Assembly a = System.Reflection.Assembly.LoadFile(f); try { foreach (Type t in a.GetTypes()) { foreach (Type i in t.GetInterfaces()) { //     IPlugin if (i.Equals(Type.GetType("HotKeyHelper.IPlugin"))) { //          IPlugin p = (IPlugin)Activator.CreateInstance(t); p.ShowBaloonHandler += ShowBaloon; p.ShowFormHandler += ShowForm; p.PasteTextHandler += PasteText; comboBox1.Items.Add(p.Name); Plugins.Add(p); break; } } } } catch (Exception) { continue; } } } 


हमें WinApi विधियों को भी कॉल करना होगा, इसके लिए हम उन्हें आयात करते हैं:

  [DllImport("User32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); [DllImport("User32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool UnregisterHotKey(IntPtr hWnd, int id); [DllImport("user32.dll", SetLastError = true)] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo); 


और हम कुछ प्लगइन्स की कार्यक्षमता को निष्पादित करने के लिए आवश्यक 2 तरीके लिखेंगे

  /// <summary> ///   Ctrl+C /// </summary> void CtrlCEmul() { keybd_event(0x11, 0, 0, 0); keybd_event((byte)'C', 0, 0, 0); keybd_event((byte)'C', 0, 0x2, 0); keybd_event(0x11, 0, 0x2, 0); } /// <summary> ///   Ctrl+V /// </summary> void CtrlVEmul() { keybd_event(0x11, 0, 0, 0); keybd_event((byte)'V', 0, 0, 0); keybd_event((byte)'V', 0, 0x2, 0); keybd_event(0x11, 0, 0x2, 0); } 


हम कस्टम हॉटकी के भंडारण के लिए एक वर्ग भी लिखते हैं:
 public class HotKey { /// <summary> ///   /// </summary> public string Plugin { get; set; } /// <summary> ///     /// </summary> public string Parametres { get; set; } /// <summary> ///   /// </summary> public string Key { get; set; } /// <summary> ///   /// </summary> public uint KeyCode { get; set; } /// <summary> ///   /// </summary> public string Modificators { get; set; } /// <summary> ///   /// </summary> public uint ModificatorsCode { get; set; } /// <summary> ///   /// </summary> /// <param name="path">   </param> /// <returns> </returns> public static List<HotKey> LoadHotKeys(string path) { List<HotKey> hotKeys = new List<HotKey>(); if (File.Exists(path)) foreach (string line in File.ReadAllLines(path)) { string[] parametres = line.Split(new string[] { "<!>" }, StringSplitOptions.None); hotKeys.Add(new HotKey() { Plugin = parametres[0], Parametres = parametres[1], Key = parametres[2], KeyCode = UInt32.Parse(parametres[3]), Modificators = parametres[4], ModificatorsCode = UInt32.Parse(parametres[5]) }); } return hotKeys; } /// <summary> ///   /// </summary> /// <param name="hotKeys"> </param> /// <param name="path">   </param> public static void SaveHotKeys(List<HotKey> hotKeys, string path) { List<string> parametres = new List<string>(); foreach (HotKey hotKey in hotKeys) { parametres.Add(String.Format("{0}<!>{1}<!>{2}<!>{3}<!>{4}<!>{5}", new object[]{hotKey.Plugin,hotKey.Parametres,hotKey.Key,hotKey.KeyCode, hotKey.Modificators,hotKey.ModificatorsCode})); } File.WriteAllLines(path, parametres); } } 


अब प्लगइन्स लोड करने के बाद हम कस्टम हॉटकी डाउनलोड कर सकते हैं और उनकी सदस्यता ले सकते हैं:

  HotKeys = HotKey.LoadHotKeys("HotKeys.txt"); //       for (int i = 0; i < HotKeys.Count; i++) { if (!RegisterHotKey(this.Handle, i, HotKeys[i].ModificatorsCode, HotKeys[i].KeyCode)) { notifyIcon1.BalloonTipText = String.Format(" {0} {1}  ", HotKeys[i].Modificators, HotKeys[i].Key); notifyIcon1.ShowBalloonTip(10000); } } 


हॉटकी के लिए साइन अप करने के बाद, WM_HOTKEY संदेश हमारी विंडो पर भेजा जाएगा। यह पता लगाने के लिए कि उपयोगकर्ता ने कब आवश्यक संयोजन क्लिक किया, हमें विधि को फिर से लिखना होगा:
  protected override void WndProc(ref Message m) { //  WM_HOTKEY if (m.Msg == 0x0312) { //       int id = (int)m.WParam; IPlugin plugin = Plugins.SingleOrDefault(pl => pl.Name == HotKeys[id].Plugin); if (plugin == null) { notifyIcon1.Text = "   "; notifyIcon1.ShowBalloonTip(10000); return; } string text = ""; if(plugin.NeedSelectedText) { //  Ctrl+C CtrlCEmul(); //,       Thread.Sleep(150); //..       ,      for (int i = 0; i < 10; i++) { try { //    text = Clipboard.GetText(); break; } catch (ExternalException) { } Thread.Sleep(100); } } //   try { plugin.MainMethod(HotKeys[id].Parametres,text); } catch (Exception ex) { notifyIcon1.Text = "    "+ex.Message; notifyIcon1.ShowBalloonTip(10000); } return; } base.WndProc(ref m); } 


अब हमें हॉटकीज़ बनाने के लिए अधिक सुविधाजनक इंटरफ़ेस जोड़ना होगा। इसमें, मुझे लगता है, कुछ भी दिलचस्प नहीं है, हालांकि मैं दिखाऊंगा कि मैंने कैसे दबाए गए संयोजन को रिकॉर्ड करने के लिए एक प्रणाली बनाई।
ऐसा करने के लिए, हमें KeyDown और KeyUp फॉर्म की घटनाओं की सदस्यता लेनी होगी:

  private void button1_Click(object sender, EventArgs e) { if (button1.Enabled) { button1.Enabled = false; isRecord = true; } } //     private void Form1_KeyDown(object sender, KeyEventArgs e) { //     "" if (isRecord) { //    modKeys = e.Modifiers; key = e.KeyCode; //     if (e.Alt) modifiers = 1; if (e.Control) modifiers = 2; if (e.Shift) modifiers = 4; if (e.Alt && e.Control) modifiers = 3; if (e.Alt && e.Shift) modifiers = 5; if (e.Control && e.Shift) modifiers = 6; if (e.Alt && e.Control && e.Shift) modifiers = 7; label1.Text = modKeys.ToString(); label2.Text = key.ToString(); } } //    private void Form1_KeyUp(object sender, KeyEventArgs e) { if (isRecord) { //    DialogResult result = MessageBox.Show(String.Format(" : {0} {1}",label1.Text,label2.Text), "", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) isRecord = false; } } 


खैर, यह बात है। कार्यक्रम तैयार है। यह केवल कुछ प्लग-इन लिखने के लिए उपयोग करना शुरू करने के लिए बना हुआ है।

प्लगइन


ताकि हम प्रोग्राम में प्लगइन का उपयोग कर सकें, हमें IPlugin से मुख्य वर्ग विरासत में प्राप्त करना चाहिए।
ऐसा करने के लिए, हमें अपने कार्यक्रम के लिए एक लिंक जोड़ने की आवश्यकता है। अब हम एक सरल प्लगइन का कार्यान्वयन लिख सकते हैं। उदाहरण के लिए, मैंने एक प्लगइन लिखा है जो चयनित पाठ को pastebin.com पर पोस्ट करेगा:
  public class PastebinSender : IPlugin { public string Name { get { return "PastebinSender"; } } public bool NeedSelectedText { get { return true; } } public event PluginHandler ShowBaloonHandler; public event PluginHandler ShowFormHandler; public event PluginHandler PasteTextHandler; /// <summary> ///   /// </summary> /// <param name="parametres">   "     :  :  "</param> /// <param name="text">  </param> public void MainMethod(string parametres, string text) { string[] param = parametres.Split(':'); bool useMessage = param[0] == "1"; string format = param[1]; string expire = param[2]; using (HttpRequest request = new HttpRequest()) { MultipartDataCollection reqParams = new MultipartDataCollection(); //   - request.UserAgent = HttpHelper.RandomChromeUserAgent(); string cont = request.Get("http://pastebin.com").ToText(); string postKey = cont.Substring("post_key\" value=\"", "\""); reqParams.AddData("post_key", postKey); reqParams.AddData("submit_hidden", "submit_hidden"); reqParams.AddData("paste_code", text); reqParams.AddData("paste_format", format); reqParams.AddData("paste_expire_date", expire); reqParams.AddData("paste_private", "1"); reqParams.AddData("paste_name", ""); //     string link = request.Post("http://pastebin.com/post.php", reqParams).Address.AbsoluteUri; if (useMessage) { ShowFormHandler(link); } else { ShowBaloonHandler(link); } } } } 


Http अनुरोधों के लिए इन प्लग इन में मैंने xNet का उपयोग किया है

मैंने चयनित पाठ के अनुवाद के लिए एक प्लगइन भी लिखा है:
  public class GoogleTranslator : IPlugin { public string Name { get { return "GoogleTranslator"; } } public bool NeedSelectedText { get { return true; } } public event PluginHandler ShowBaloonHandler; public event PluginHandler ShowFormHandler; public event PluginHandler PasteTextHandler; /// <summary> ///   /// </summary> /// <param name="parametres">   "   :     "</param> /// <param name="text">  </param> public void MainMethod(string parametres, string text) { //   string[] param = parametres.Split(':'); string ToLang = param[0]; bool useMessage = param[1] == "1"; //     ::,       string[] message = text.Split(new string[] { "::" }, StringSplitOptions.None); if (message.Length != 2) { //     if (isRussian(text)) { //     string translate = GetTranslate(text, ToLang); PasteTextHandler(translate); } //      else { //    string translate = GetTranslate(text, "ru"); //     if (useMessage) { ShowFormHandler(translate); } else { ShowBaloonHandler(translate); } } } //    ::,       else { string mess = message[1]; string toLang = message[0]; //     string translate = GetTranslate(mess, toLang); PasteTextHandler(translate); } } private string GetTranslate(string message, string toLang) { //      - using (HttpRequest request = new HttpRequest()) { StringDictionary reqParams = new StringDictionary(); //   - request.UserAgent = HttpHelper.RandomChromeUserAgent(); reqParams["tl"] = toLang; reqParams["sl"] = "auto"; reqParams["client"] = "x"; string translate = ""; ShowBaloonHandler("..."); reqParams["text"] = message; //    string s = request.Get( "http://translate.google.ru/translate_a/t", reqParams).ToText(); //      string[] ts = s.Substrings("trans\":\"", "\","); foreach (string t in ts) { string tr = t; if (tr.Contains('\"')) { tr = tr.Replace("\\", ""); } //  if (translate != "") { translate = translate + " " + tr; } else { translate = tr; } } return translate; } } bool isRussian(string text) { foreach (char c in text) { if ((c >= '' && c <= '')) return true; } return false; } } 


प्लगइन लिखने और संकलित करने के बाद, हमें इसे प्रोग्राम के साथ 1 फ़ोल्डर में रखने की आवश्यकता है, और अगली बार जब आप शुरू करेंगे, तो आप इस प्लगइन के निष्पादन को एक विशिष्ट हॉटकी से "बाइंड" कर सकते हैं।

Source: https://habr.com/ru/post/In143315/


All Articles