![]() ![]() ![]()
Какой рейтинг вас больше интересует?
|
Главная /
Каталог блоговCтраница блогера Справочник по C#/Записи в блоге |
![]() |
|
Мониторинг буфера обмена
2012-10-15 09:02:37 (читать в оригинале)
![](http://3.bp.blogspot.com/-aojyZRmFcCw/UHt843LWQsI/AAAAAAAABc8/MWdVe1ryg9Q/s400/klipper.png)
ОС Windows поддерживает список, или цепь, приложений, которые обратились с просьбой получить уведомление, когда данные поступят в буфер обмена. Каждый раз, когда в буфере обмена изменяется данные, первое приложение в этой цепочке получает сообщение - WM_DRAWCLIPBOARD. Приложения могут запросить тип данных в буфере обмена, например RTF, ASCII текст, и так далее. Так как нет управляемых (. NET) API для добавления приложения в цепочку, чтобы получать уведомление об изменении буфера, вы должны использовать Win32 SetClipboardViewer. Вы должны знать некоторые общие правила при использовании этой функции.
• При вызове SetClipboardViewer, вам необходимо пройти дескриптор окна, которое будет получать сообщение WM_DRAWCLIPBOARD. SetClipboardViewer функция возвращает текущее первое приложение в цепочке. Ваше приложение должно хранить в классе членов, потому что каждое приложение которое получает сообщение WM_DRAWCLIPBOARD может отправить то же сообщение к следующему приложению в цепочке (через функцию SendMessage).
• WM_CHANGECBCHAIN. Поскольку каждое приложение, которое обрабатывает WM_DRAWCLIPBOARD, отвечает за отправку этого сообщения к следующему приложению в цепочке, оно также должно знать, когда изменилась цепь. Буфер обмена посылает сообщения WM_CHANGECBCHAIN , когда приложение удалило себя из цепочки.
• При завершении работы необходимо удалить приложение из цепочки. Эта задача решается с помощью Win32ChangeClipboardChain функции, и это может быть сделано в любое время, буфер обмена мониторинга больше не нужен.
Для работы вам понадобится разместить компонент richTextBox. Так же в его свойствах ForeColor указать цвет Black!
Вот код приложения:
IntPtr nextClipboardViewer; public Form1() { InitializeComponent(); nextClipboardViewer = (IntPtr)SetClipboardViewer((int) this.Handle); } [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); protected override void WndProc(ref System.Windows.Forms.Message m) { const int WM_DRAWCLIPBOARD = 0x308; const int WM_CHANGECBCHAIN = 0x030D; switch (m.Msg) { case WM_DRAWCLIPBOARD: DisplayClipboardData(); SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); break; case WM_CHANGECBCHAIN: if (m.WParam == nextClipboardViewer) nextClipboardViewer = m.LParam; else SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); break; default: base.WndProc(ref m); break; } } void DisplayClipboardData() { try { IDataObject iData = new DataObject(); iData = Clipboard.GetDataObject(); if (iData.GetDataPresent(DataFormats.Rtf)) richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf); else if (iData.GetDataPresent(DataFormats.Text)) richTextBox1.Text = (string)iData.GetData(DataFormats.Text); else richTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]"; } catch (Exception e) { MessageBox.Show(e.ToString()); } }Так же вам необходимо в Form1.Designer.cs заменить функцию Dispose:
![](http://3.bp.blogspot.com/-Um0DVURgvHk/UHuXyU3IzYI/AAAAAAAABds/Gy9v4SPdOn4/s400/98745222.png)
protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); }НА:
protected override void Dispose(bool disposing) { ChangeClipboardChain(this.Handle, nextClipboardViewer); if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); }
Скриншот получившегося приложения:
![](http://3.bp.blogspot.com/-BpjhpBuIC8s/UHuYzJ0BeEI/AAAAAAAABeE/ouYU2hymZ6w/s400/65498711.png)
![BlogRider сегодня BlogRider сегодня](/themes/1/i/menu/th/blogrider_today.png)
![Самый-самый блог Самый-самый блог](/themes/1/i/menu/tt/tough.png)
![Изменения рейтинга Изменения рейтинга](/themes/1/i/menu/th/rating_changes.png)
Категория «Истории»
Взлеты Топ 5
![]() | ||
+1920 |
1940 |
Дрочливый_Драчун |
+1899 |
1946 |
Коптящий_Небо |
+1891 |
1957 |
Da_Queen_of_Da_World |
+1873 |
1964 |
Splash_Phantom |
+1754 |
1777 |
jolly_M |
Падения Топ 5
![]() | ||
-1 |
1270 |
Выдающиеся женщины |
-1 |
829 |
Работа в интернете |
-1 |
1180 |
Вкусное меню |
-2 |
84 |
xpyctal |
-2 |
1062 |
TradeIP |
![Главные темы Главные темы](/themes/1/i/menu/th/main_themes.png)
Популярные за сутки
Загрузка...
![Загрузка... Загрузка...](/themes/1/i/loader/loader.gif)
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.
взяты из открытых общедоступных источников и являются собственностью их авторов.