C # рдореЗрдВ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд▓рд┐рдЦрдирд╛

VirtualClipBoard рдЖрдкрдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдб, рд▓реЗрдЦ, рдкреЛрд╕реНрдЯ рдЖрджрд┐ред рдЬрдм рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдХреЗ рдиреАрдЪреЗ рд░рд╣ рд░рд╣рд╛ рдерд╛, рддреЛ рдореИрдВрдиреЗ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдЗрддрд┐рд╣рд╛рд╕ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╛рдж рдерд╛ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯрдмреЛрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рдФрд░ рдЯреНрд░реЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдореИрдВ рд╕реНрд░реЛрдд рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдмрдлрд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдкрдбрд╝рд╛, рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕рдВрддреЛрд╖рдЬрдирдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдкрд╛рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рднреА рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛: рдореБрдлреНрдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдирд╣реАрдВ, рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдЬреЛ рдмрд╕ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреА рд╣реИ) рдпрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХрд░рддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдкрд┐рдЫрд▓реЗ рдмрдлрд░ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рдВрдбреЛ рдЦреЛрд▓рдиреА рдереА)ред рджреЛ рдмрд╛рд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореИрдВрдиреЗ рдЬреИрд╕рд╛ рдЪрд╛рд╣рд╛ рд╡реИрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдЪреВрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реА # рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ рдХрднреА рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдерд╛ - рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдерд╛ред

рдХрд╛рд░реНрдп






рдЗрдВрдЯрд░рдлрд╝реЗрд╕




VirtualClipBoard

рдореИрдВ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд░рдЦреА рдЧрдИ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкреИрдХ рдХреА рдЧрдИ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ + рдПрдХ exe рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓рд┐рдВрдХ рд╣реИред


рдХреЛрдб рд╣реА



рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ Properties.Settings.Default : "рдЗрддрд┐рд╣рд╛рд╕ рдХрд╛ рдЖрдХрд╛рд░" рдФрд░ "рдЯреНрд░реЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:

//    private void history_size_ValueChanged(object sender, EventArgs e) { Properties.Settings.Default.history_size = (int)history_size.Value; Properties.Settings.Default.Save(); Console.WriteLine("  : " + Properties.Settings.Default.history_size); reload_list_clipboard(); //  ListBox } //       private void size_tray_ValueChanged(object sender, EventArgs e) { Properties.Settings.Default.size_tray = (int)size_tray.Value; Properties.Settings.Default.Save(); Console.WriteLine("    : " + Properties.Settings.Default.size_tray); reload_tray(); //   } 


рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк, рдкреНрд░реЛрдЧреНрд░рд╛рдо, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕рд╣рдордд рдереЗ, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  //      //   -      private void autoload_CheckedChanged(object sender, EventArgs e) { RegistryKey reg = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", true); if (reg.GetValue(VirtualClipBoard_Name) != null) { try { reg.DeleteValue(VirtualClipBoard_Name); Console.WriteLine(" " + VirtualClipBoard_Name + "     "); } catch { Console.WriteLine("  " + VirtualClipBoard_Name + "    "); } } if(autoload.Checked) { reg.SetValue(VirtualClipBoard_Name, Application.ExecutablePath); Console.WriteLine(" " + VirtualClipBoard_Name + "     "); } reg.Close(); } 


рд╡рд┐рдВрдбреЛ рдмрдВрдж рдХрд░рддреЗ рд╕рдордп, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЯреНрд░реЗ рдкрд░ рдХрдо рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП
  //       protected override void OnClosing(CancelEventArgs e) { e.Cancel = true; // ShowInTaskbar = false; Hide(); } 


рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐
  //        private void exit_Click(object sender, EventArgs e) { Application.Exit(); } 


рдЪреВрдВрдХрд┐, рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЬрд╛рдБрдЪ рдПрдХ рд╡рд┐рдХреГрдд + рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЕрдиреБрдЪрд┐рдд рдЕрдкрд╢рд┐рд╖реНрдЯ рд╣реИ, рд╣рдо User32.dll рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рдВрдбреЛ рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд╡рд┐рдВрдбреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WndProc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдмрд▓реНрдХрд┐ WM_DRAWCLIPBOARD = 0x0308 , рдЬреЛ рд╣рдореЗрдВ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, 1. рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
  [DllImport("User32.dll")] protected static extern int SetClipboardViewer(int hWndNewViewer); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); 


2. рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП WndProc рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
  //   private IntPtr nextClipboardViewer; //  public const int WM_DRAWCLIPBOARD = 0x0308; public const int WM_CHANGECBCHAIN = 0x030D; //         .. protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_DRAWCLIPBOARD: { ClipboardChanged(); SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); break; } case WM_CHANGECBCHAIN: { if (m.WParam == nextClipboardViewer) { nextClipboardViewer = m.LParam; } else { SendMessage(nextClipboardViewer, WM_CHANGECBCHAIN, m.WParam, m.LParam); } m.Result = IntPtr.Zero; break; } default: { base.WndProc(ref m); break; } } } 


3. рдлреЙрд░реНрдо рдЕрдкрд▓реЛрдб рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдорд╛рд░реА рд╡рд┐рдВрдбреЛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ:
 nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle); 


4. рдЕрдм рдЖрдкрдХреЛ рдмрдлрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрддрд┐рд╣рд╛рд╕ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд┐рдкрдмреЛрд░реНрдбрдЪреЗрдВрдЬ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВред рдЗрддрд┐рд╣рд╛рд╕ рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ <int, string> VirtualClipBoard_History = рдирдпрд╛ рд╢рдмреНрджрдХреЛрд╢ <int, string> (); рдпрджрд┐ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рд╡рд┐рдзрд┐ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рддрддреНрд╡реЛрдВ рд╕реЗ рд╕рдлрд╛рдИ рднреА рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд╕рд╛рде рд╣реА, рдкрд┐рдЫрд▓реЗ рд╕рддреНрд░ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо VirtualClipBoard_DAT рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирдП рддрддреНрд╡ рд▓рд┐рдЦреЗрдВрдЧреЗред

  //     private void ClipboardChanged() { if (Clipboard.ContainsText() && Clipboard.GetText().Length > 0 && VirtualClipBoard_TARGET != Clipboard.GetText()) { VirtualClipBoard_TARGET = Clipboard.GetText(); //      VirtualClipBoard_History.Add((VirtualClipBoard_History.Last().Key + 1), VirtualClipBoard_TARGET); reload_tray(); //    reload_list_clipboard(); //  ListBox //      if (VirtualClipBoard_History.Count() > Properties.Settings.Default.history_size) { int clear_items_count = VirtualClipBoard_History.Count() - Properties.Settings.Default.history_size; var list = VirtualClipBoard_History.Keys.ToList(); list.Sort(); foreach (var key in list) { VirtualClipBoard_History.Remove(key); if (clear_items_count == 1) { break; } else { clear_items_count--; } } } //       StreamWriter writer = new StreamWriter(VirtualClipBoard_DAT, true, System.Text.Encoding.UTF8); writer.WriteLine(@"<item>" + VirtualClipBoard_TARGET.Replace(@"<", @"<").Replace(@">", @">") + @"</item>"); writer.Close(); Console.WriteLine("    : " + VirtualClipBoard_TARGET); } } 


рдЯреНрд░реЗ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, reload_tray рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВред рд╣рдо ContextMenuStrip рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ ToolStripMenuItem рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ TAG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдХреБрдВрдЬреА рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдЬрдм рдЖрдк рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рддреЛ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдЖрдЗрдЯрдо рдХреЛ рдЦреАрдВрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реЛред
  //     private void reload_tray() { ContextMenuStrip contextMenu = new ContextMenuStrip(); ToolStripMenuItem menuItem; int free_slot_to_tray = Properties.Settings.Default.size_tray; var list = VirtualClipBoard_History.OrderByDescending(x => x.Key); foreach (var item in list) { menuItem = new ToolStripMenuItem(); menuItem.Tag = item.Key; if (item.Value.Length > 60) { menuItem.Text = item.Value.Replace("\n", "\t").Replace("\r", "\t").Substring(0, 60); } else { menuItem.Text = item.Value.Replace("\n", "\t").Replace("\r", "\t"); } menuItem.Click += new System.EventHandler(menu_item_click); contextMenu.Items.Add(menuItem); if (free_slot_to_tray == 1) { break; } else { free_slot_to_tray--; } } //  contextMenu.Items.Add(new ToolStripSeparator()); // / menuItem = new ToolStripMenuItem(); menuItem.Text = ""; menuItem.Click += new System.EventHandler(menu_item_config); contextMenu.Items.Add(menuItem); //    menuItem = new ToolStripMenuItem(); menuItem.Text = ""; menuItem.Click += new System.EventHandler(exit_Click); contextMenu.Items.Add(menuItem); _notifyIcon.ContextMenuStrip = contextMenu; } 


рдЯреНрд░реЗ рдореЗрдВ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдХреНрд▓рд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдШрдЯрдирд╛рдПрдБ:
  //          private void menu_item_click(object sender, EventArgs e) { Clipboard.SetText(VirtualClipBoard_History[(int)(sender as ToolStripMenuItem).Tag]); } 


рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлреЙрд░реНрдо рдореЗрдВ рд╕реВрдЪреА рдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдЬрдирд░реЗрдЯ рдХрд░реЗрдВред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рдмреНрджрдХреЛрд╢ VirtualClipBoard_Index_ListBox = new Dictionary <int, int> () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ; VirtualClipBoard_History рдЗрддрд┐рд╣рд╛рд╕ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рд╕реНрдЯрдмреЙрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП:
  //    ListBox private void reload_list_clipboard() { VirtualClipBoard_Index_ListBox = new Dictionary<int, int>(); int list_target_item = 0; //     ListBox list_clipboard.Items.Clear(); //   String string_name_ite; int free_slot_to_tray = Properties.Settings.Default.history_size; var list = VirtualClipBoard_History.OrderByDescending(x => x.Key); foreach (var item in list) { if (item.Value.Length > 150) { string_name_ite = item.Value.Replace("\n", "\t").Replace("\r", "\t").Substring(0, 60); } else { string_name_ite = item.Value.Replace("\n", "\t").Replace("\r", "\t"); } list_clipboard.Items.Add(string_name_ite); VirtualClipBoard_Index_ListBox.Add(list_target_item, item.Key); if (free_slot_to_tray == 1) { break; } else { free_slot_to_tray--; } list_target_item++; //      ListBox } } 


рдХрд┐рд╕реА рд╕реВрдЪреА рдмреЙрдХреНрд╕ рдореЗрдВ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп , list_clipboard_SelectedIndexChanged рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ :
  //    ListBox private void list_clipboard_SelectedIndexChanged(object sender, EventArgs e) { Clipboard.SetText(VirtualClipBoard_History[VirtualClipBoard_Index_ListBox[list_clipboard.SelectedIndex]]); } 


рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╣рдо VirtualClipBoard_DAT рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЗрддрд┐рд╣рд╛рд╕ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ XML рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рддрддреНрд╡реЛрдВ рдореЗрдВ рдХреИрд░рд┐рдЬ рд░рд┐рдЯрд░реНрди рд╡рд░реНрдг (\ n) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдкрдврд╝рдиреЗ рдкрд░ рдбреЗрдЯрд╛ рдЕрдЦрдВрдбрддрд╛ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдХреНрд░рдорд╛рдВрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрдлрд░ рдореЗрдВ рд╣рд░ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЧрддрд┐ рдХреЛ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рд╕рд╣реА рд╣реЛрдЧрд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ (рдореИрдВ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реБрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ - рдореИрдВ рддреБрд░рдВрдд рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ)ред
рдореИрдВ рдбреЗрдЯрд╛ рдХреЛ рдПрдирдХреЛрдб рдХрд░рдирд╛ рднреА рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореИрдВ рдбреЗрдЯрд╛ рдХреЗ рдореВрд▓ рд░реВрдк рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддрд╛рдХрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореИрдВ рдиреЛрдЯрдкреИрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрддрд┐рд╣рд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝ рд╕рдХреВрдВред
  //     String XMLString = ""; XMLString += @"<items>"; if (File.Exists(VirtualClipBoard_DAT)) { StreamReader stream = new StreamReader(VirtualClipBoard_DAT); while (stream.Peek() > -1) { XMLString += stream.ReadLine() + "\n"; } stream.Close(); XMLString += @"</items>"; int index_new_history = 2; XDocument doc = XDocument.Parse(XMLString); var items = doc.Element("items").Elements("item"); foreach (XElement item in items) { VirtualClipBoard_History.Add(index_new_history, item.Value); index_new_history++; //     } } 


рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб


рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб
 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.Win32; using System.Runtime.InteropServices; using System.Data.Sql; using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Xml.Linq; using System.Windows; namespace VirtualClipBoard { public partial class VirtualClipBoard : Form { String VirtualClipBoard_Name = "VirtualClipBoard"; //   public String VirtualClipBoard_TARGET; //     public String VirtualClipBoard_DAT; //     Dictionary<int, string> VirtualClipBoard_History = new Dictionary<int, string>(); //    Dictionary<int, int> VirtualClipBoard_Index_ListBox; //         //   WIN [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); //  Form public VirtualClipBoard() { InitializeComponent(); load_configs(); nextClipboardViewer = (IntPtr)SetClipboardViewer((IntPtr)this.Handle); reload_tray(); //    reload_list_clipboard(); //  ListBox _notifyIcon.Text = VirtualClipBoard_Name; _notifyIcon.MouseDoubleClick += new MouseEventHandler(_notifyIcon_MouseDoubleClick); } //    ListBox private void reload_list_clipboard() { VirtualClipBoard_Index_ListBox = new Dictionary<int, int>(); int list_target_item = 0; //     ListBox list_clipboard.Items.Clear(); //   String string_name_ite; int free_slot_to_tray = Properties.Settings.Default.history_size; var list = VirtualClipBoard_History.OrderByDescending(x => x.Key); foreach (var item in list) { if (item.Value.Length > 150) { string_name_ite = item.Value.Replace("\n", "\t").Replace("\r", "\t").Substring(0, 60); } else { string_name_ite = item.Value.Replace("\n", "\t").Replace("\r", "\t"); } list_clipboard.Items.Add(string_name_ite); VirtualClipBoard_Index_ListBox.Add(list_target_item, item.Key); if (free_slot_to_tray == 1) { break; } else { free_slot_to_tray--; } list_target_item++; //      ListBox } } //    ListBox private void list_clipboard_SelectedIndexChanged(object sender, EventArgs e) { Clipboard.SetText(VirtualClipBoard_History[VirtualClipBoard_Index_ListBox[list_clipboard.SelectedIndex]]); } //     private void reload_tray() { ContextMenuStrip contextMenu = new ContextMenuStrip(); ToolStripMenuItem menuItem; int free_slot_to_tray = Properties.Settings.Default.size_tray; var list = VirtualClipBoard_History.OrderByDescending(x => x.Key); foreach (var item in list) { menuItem = new ToolStripMenuItem(); menuItem.Tag = item.Key; if (item.Value.Length > 60) { menuItem.Text = item.Value.Replace("\n", "\t").Replace("\r", "\t").Substring(0, 60); } else { menuItem.Text = item.Value.Replace("\n", "\t").Replace("\r", "\t"); } menuItem.Click += new System.EventHandler(menu_item_click); contextMenu.Items.Add(menuItem); if (free_slot_to_tray == 1) { break; } else { free_slot_to_tray--; } } //  contextMenu.Items.Add(new ToolStripSeparator()); // / menuItem = new ToolStripMenuItem(); menuItem.Text = ""; menuItem.Click += new System.EventHandler(menu_item_config); contextMenu.Items.Add(menuItem); //    menuItem = new ToolStripMenuItem(); menuItem.Text = ""; menuItem.Click += new System.EventHandler(exit_Click); contextMenu.Items.Add(menuItem); _notifyIcon.ContextMenuStrip = contextMenu; } //    private void menu_item_config(object sender, EventArgs e) { // ShowInTaskbar = true; Show(); WindowState = FormWindowState.Normal; } //          private void menu_item_click(object sender, EventArgs e) { // Console.WriteLine((int)(sender as ToolStripMenuItem).Tag); Clipboard.SetText(VirtualClipBoard_History[(int)(sender as ToolStripMenuItem).Tag]); } //         private void _notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) { Console.WriteLine(WindowState); if (WindowState == FormWindowState.Normal || WindowState == FormWindowState.Maximized) { // ShowInTaskbar = false; Hide(); WindowState = FormWindowState.Minimized; } else { // ShowInTaskbar = true; Show(); WindowState = FormWindowState.Normal; } } //        private void load_configs() { VirtualClipBoard_DAT = Application.UserAppDataPath + "\\history.dat"; Console.WriteLine(" : " + VirtualClipBoard_DAT); history_size.Value = Properties.Settings.Default.history_size; Console.WriteLine("    : " + Properties.Settings.Default.history_size); size_tray.Value = Properties.Settings.Default.size_tray; Console.WriteLine("      : " + Properties.Settings.Default.size_tray); RegistryKey reg = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", true); if (reg.GetValue(VirtualClipBoard_Name) != null){ autoload.Checked = true; Console.WriteLine("   . (   Checked = true)"); } reg.Close(); //     String XMLString = ""; XMLString += @"<items>"; if (File.Exists(VirtualClipBoard_DAT)) { StreamReader stream = new StreamReader(VirtualClipBoard_DAT); while (stream.Peek() > -1) { XMLString += stream.ReadLine() + "\n"; } stream.Close(); XMLString += @"</items>"; int index_new_history = 2; XDocument doc = XDocument.Parse(XMLString); var items = doc.Element("items").Elements("item"); foreach (XElement item in items) { VirtualClipBoard_History.Add(index_new_history, item.Value); index_new_history++; //     } } //    if (VirtualClipBoard_History.Count() > Properties.Settings.Default.history_size) { int clear_items_count = VirtualClipBoard_History.Count() - Properties.Settings.Default.history_size; var list = VirtualClipBoard_History.Keys.ToList(); list.Sort(); foreach (var key in list) { VirtualClipBoard_History.Remove(key); if (clear_items_count == 1) { break; } else { clear_items_count--; } } } //    StreamWriter writer = new StreamWriter(VirtualClipBoard_DAT, false, System.Text.Encoding.UTF8); var new_list = VirtualClipBoard_History.Keys.ToList(); new_list.Sort(); foreach (var key in new_list) { writer.WriteLine(@"<item>" + VirtualClipBoard_History[key].Replace(@"<", @"<").Replace(@">", @">") + @"</item>"); } writer.Close(); //   ,    Console.WriteLine(VirtualClipBoard_History.Count()); if (VirtualClipBoard_History.Count() == 0) { VirtualClipBoard_TARGET = Clipboard.GetText(); VirtualClipBoard_History.Add(1, VirtualClipBoard_TARGET); } VirtualClipBoard_TARGET = VirtualClipBoard_History.Last().Value; } //      //   -      private void autoload_CheckedChanged(object sender, EventArgs e) { RegistryKey reg = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", true); if (reg.GetValue(VirtualClipBoard_Name) != null) { try { reg.DeleteValue(VirtualClipBoard_Name); Console.WriteLine(" " + VirtualClipBoard_Name + "     "); } catch { Console.WriteLine("  " + VirtualClipBoard_Name + "    "); } } if(autoload.Checked) { reg.SetValue(VirtualClipBoard_Name, Application.ExecutablePath); Console.WriteLine(" " + VirtualClipBoard_Name + "     "); } reg.Close(); } //        private void exit_Click(object sender, EventArgs e) { Application.Exit(); } //    private void history_size_ValueChanged(object sender, EventArgs e) { Properties.Settings.Default.history_size = (int)history_size.Value; Properties.Settings.Default.Save(); Console.WriteLine("  : " + Properties.Settings.Default.history_size); reload_list_clipboard(); //  ListBox } //       private void size_tray_ValueChanged(object sender, EventArgs e) { Properties.Settings.Default.size_tray = (int)size_tray.Value; Properties.Settings.Default.Save(); Console.WriteLine("    : " + Properties.Settings.Default.size_tray); reload_tray(); //   } //     private void ClipboardChanged() { if (Clipboard.ContainsText() && Clipboard.GetText().Length > 0 && VirtualClipBoard_TARGET != Clipboard.GetText()) { VirtualClipBoard_TARGET = Clipboard.GetText(); //      VirtualClipBoard_History.Add((VirtualClipBoard_History.Last().Key + 1), VirtualClipBoard_TARGET); reload_tray(); //    reload_list_clipboard(); //  ListBox //      if (VirtualClipBoard_History.Count() > Properties.Settings.Default.history_size) { int clear_items_count = VirtualClipBoard_History.Count() - Properties.Settings.Default.history_size; var list = VirtualClipBoard_History.Keys.ToList(); list.Sort(); foreach (var key in list) { VirtualClipBoard_History.Remove(key); if (clear_items_count == 1) { break; } else { clear_items_count--; } } } //       StreamWriter writer = new StreamWriter(VirtualClipBoard_DAT, true, System.Text.Encoding.UTF8); writer.WriteLine(@"<item>" + VirtualClipBoard_TARGET.Replace(@"<", @"<").Replace(@">", @">") + @"</item>"); writer.Close(); Console.WriteLine("    : " + VirtualClipBoard_TARGET); } } //    private void clear_Click(object sender, EventArgs e) { StreamWriter writer = new StreamWriter(VirtualClipBoard_DAT, false, System.Text.Encoding.Default); writer.Write(""); writer.Close(); VirtualClipBoard_History = new Dictionary<int, string>(); VirtualClipBoard_TARGET = Clipboard.GetText(); VirtualClipBoard_History.Add(1, VirtualClipBoard_TARGET); reload_tray(); //    reload_list_clipboard(); //  ListBox } //       protected override void OnClosing(CancelEventArgs e) { e.Cancel = true; //ShowInTaskbar = false; Hide(); WindowState = FormWindowState.Minimized; } //   private IntPtr nextClipboardViewer; //  public const int WM_DRAWCLIPBOARD = 0x308; public const int WM_CHANGECBCHAIN = 0x030D; //         .. protected override void WndProc(ref Message m) { // Console.WriteLine("WndProc"); switch (m.Msg) { case WM_DRAWCLIPBOARD: { ClipboardChanged(); Console.WriteLine("WM_DRAWCLIPBOARD ClipboardChanged();"); SendMessage(nextClipboardViewer, WM_DRAWCLIPBOARD, m.WParam, m.LParam); break; } case WM_CHANGECBCHAIN: { if (m.WParam == nextClipboardViewer) { nextClipboardViewer = m.LParam; } else { SendMessage(nextClipboardViewer, WM_CHANGECBCHAIN, m.WParam, m.LParam); } m.Result = IntPtr.Zero; break; } default: { base.WndProc(ref m); break; } } } } } 


рд╕рдВрджрд░реНрдн:


Properties.Settings.Default - рдХрд╕реНрдЯрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рд╣реЗрдЬрдирд╛
рд░рдЬрд┐рд╕реНрдЯреНрд░реА.рд▓реЛрдХрдорд╛рдЪрд┐рди - рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
SetClipboardViewer - рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рджрд░реНрд╢рдХ рд╡рд┐рдВрдбреЛ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдВрдбреЛ рдЬреЛрдбрд╝реЗрдВред
рдХреНрд▓рд╛рд╕ рд╕реНрдЯреНрд░реАрдорд░рд╛рдЗрдЯрд░ - рдлрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВ
рдХреНрд▓рд╛рд╕ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯрдореЗрдиреНрдпреВрд╕реНрдЯреНрд░рд┐рдк - рд╕рдВрджрд░реНрдн рдореЗрдиреВ
рд╢рдмреНрджрдХреЛрд╢ рд╡рд░реНрдЧ - рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред
рдХреНрд▓рд╛рд╕ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб - рд╕рд┐рд╕реНрдЯрдо рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдВрдХ:


рдЬрд╝рд┐рдк (133KB) рдореЗрдВ рд╡реАрдПрд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рд╕рдВрдХрд▓рд┐рдд EXE рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (225KB)

рдЕрджреНрдпрддрди 1: GitHub рдкрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛: https://github.com/yanzlatov/ClipBoard

рдЕрджреНрдпрддрди 2: рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдареАрдХ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдкрдиреЗ ShowInTaskbar = false ( рд╕реЗрдЯ рдпрд╛ рд╡рд┐рдВрдбреЛрдЬ рдЯрд╛рд╕реНрдХрдмрд╛рд░ рдореЗрдВ рдлреЙрд░реНрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ ) рдПрдХ рдЕрдЬреАрдмреЛрдЧрд░реАрдм рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ ред рд╣рдорд╛рд░реА рд╡рд┐рдВрдбреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдЕрдкрдбреЗрдЯ рд╢реНрд░рд╡рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдЧрд┐рд░рддреА рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЕрдкрдбреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред ред

UPDATE 3: Microsoft.in32.Registry.LocalMachine рдХреЛ Microsoft.Win32.Registry.CurrentUser рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЧрдпрд╛ред ( рд╕рд╛рднрд╛рд░ xaizek )

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


All Articles