Ответ 1
Вы можете использовать SetClipboardViewer, предоставляемый Win32 API (через P/Invoke).
Вот страница, которая содержит код для его установки в С#: http://www.codeguru.com/csharp/.net/net_general/tipstricks/article.php/c7315/
Я хочу использовать эту функцию в своей программе на С#: когда пользователь делает Ctrl + C или копирует в любом месте (т.е. когда изменяется содержимое буфера обмена), моя программа получит уведомление и проверит, соответствовал ли контент определенным критерии, если это так, становятся активной программой, обрабатывают контент и т.д.
Я могу получить содержимое из System.Windows.Forms.Clipboard
, однако я не знаю, как отслеживать изменения содержимого из буфера обмена.
При использовании Windows Vista или более поздней версии используйте AddClipboardFormatListener
, как в ответе Джона Кноллера, для Windows XP я должен использовать более старый, более хрупкий API SetClipboardViewer
, как в принятом ответе.
Вы можете использовать SetClipboardViewer, предоставляемый Win32 API (через P/Invoke).
Вот страница, которая содержит код для его установки в С#: http://www.codeguru.com/csharp/.net/net_general/tipstricks/article.php/c7315/
Я написал небольшой служебный класс, который использует функцию AddClipboardFormatListener с Message-only, чтобы сделать это.
/// <summary>
/// Provides notifications when the contents of the clipboard is updated.
/// </summary>
public sealed class ClipboardNotification
{
/// <summary>
/// Occurs when the contents of the clipboard is updated.
/// </summary>
public static event EventHandler ClipboardUpdate;
private static NotificationForm _form = new NotificationForm();
/// <summary>
/// Raises the <see cref="ClipboardUpdate"/> event.
/// </summary>
/// <param name="e">Event arguments for the event.</param>
private static void OnClipboardUpdate(EventArgs e)
{
var handler = ClipboardUpdate;
if (handler != null)
{
handler(null, e);
}
}
/// <summary>
/// Hidden form to recieve the WM_CLIPBOARDUPDATE message.
/// </summary>
private class NotificationForm : Form
{
public NotificationForm()
{
NativeMethods.SetParent(Handle, NativeMethods.HWND_MESSAGE);
NativeMethods.AddClipboardFormatListener(Handle);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == NativeMethods.WM_CLIPBOARDUPDATE)
{
OnClipboardUpdate(null);
}
base.WndProc(ref m);
}
}
}
internal static class NativeMethods
{
// See http://msdn.microsoft.com/en-us/library/ms649021%28v=vs.85%29.aspx
public const int WM_CLIPBOARDUPDATE = 0x031D;
public static IntPtr HWND_MESSAGE = new IntPtr(-3);
// See http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool AddClipboardFormatListener(IntPtr hwnd);
// See http://msdn.microsoft.com/en-us/library/ms633541%28v=vs.85%29.aspx
// See http://msdn.microsoft.com/en-us/library/ms649033%28VS.85%29.aspx
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
}
Этот класс предполагает, что уведомления всегда необходимы для продолжительности жизни приложений, однако его можно было бы изменить, чтобы предоставить возможность отказаться от подписки через функцию RemoveClipboardFormatListener, если требуется.
Вы можете сделать это с помощью pinvoke для API Win32 AddClipboardFormatListener
Слушатель - это дескриптор окна (Form.Handle), и форма будет уведомлена об изменениях с помощью Уведомление WM_CLIPBOARDUPDATE
Это более надежная замена более старого API SetClipboardViewer
.
API Win32 содержит функцию SetClipboardViewer.