我想编写一个程序来监视使用C#的Windows剪贴板。我发现了一些关于这个主题的帖子。根据线程How to monitor clipboard content changes in C#?和Finding the handle to a WPF window,我使用WPF编写了一个演示。在我发现的所有示例代码中,所有这些代码都是WinForm或WPF应用程序,而win32 api则将需要窗口句柄作为参数进行交互。 例如api函数SetClipboardViewer(HWND hWndNewViewer)
但在我的场景中,我需要我的程序运行后台作为服务来监视和收集剪贴板内容。没有窗口UI如何监控剪贴板?
你能给我一些建议吗?提前谢谢。
根据用户1795804的建议,我写下以下测试代码
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
public static class User32
{
[DllImport("User32.dll")]
public static extern IntPtr OpenClipboard(IntPtr hWndNewOwner);
[DllImport("User32.dll")]
public static extern IntPtr GetClipboardData(uint uFormat);
}
class Program
{
static void Main(string[] args)
{
int result = (int)User32.OpenClipboard(new IntPtr(0));
if (result == 0)
{
Console.WriteLine("error");
}
else
{
Console.WriteLine("success");
}
int returnHandle = (int)User32.GetClipboardData(1); //CF_TEXT 1
if (returnHandle == 0)
{
Console.WriteLine("can't get text data");
}
Console.ReadKey();
}
}
}
结果是我可以打开剪贴板并且似乎获得了日期对象的句柄。 但现在我有两个问题。
1.虽然我在剪贴板中有数据对象句柄,但如何使用句柄获取此数据?我找不到相关的功能。
2.我需要传递一个proc函数作为回调,以便它可以在系统事件引发时接收消息。但我在非窗口应用程序中找不到对应物。
答案 0 :(得分:1)
根据微软的说法,“有三种方法可以监控剪贴板的变化。最老的方法是创建剪贴板查看器窗口.Windows 2000增加了查询剪贴板序列号的功能,Windows Vista增加了对剪贴板格式的支持支持剪贴板查看器窗口,以便与早期版本的Windows向后兼容。新程序应使用剪贴板格式侦听器或剪贴板序列号。“
此GetClipboardSequenceNumber不接受任何参数,并且根据Microsoft, “系统为每个窗口站保留剪贴板的序列号。只要剪贴板的内容发生变化或剪贴板清空,该数字就会递增。您可以跟踪此值以确定剪贴板内容是否已更改并优化创建DataObjects。如果剪贴板渲染延迟,则在呈现更改之前,序列号不会递增。“
这将满足您对“我想编写程序以使用C#监视Windows剪贴板”的要求。