我想编写一个程序来使用 C# 监视 Windows 剪贴板。我发现了一些关于这个主题的帖子。根据线程How to monitor clipboard content changes in C#? 并找到 WPF 窗口的句柄,我使用 WPF 编写了一个演示。在我找到的所有示例代码中,它们都是 WinForm 或 WPF 应用程序,并且它们与需要窗口句柄作为参数互操作的 win32 api。如api函数SetClipboardViewer(HWND hWndNewViewer)
但在我的场景中,我需要我的程序运行后台作为服务来监控和收集剪贴板内容。如何在没有窗口 UI 的情况下监视剪贴板?
你能给我一些建议吗?提前致谢。
根据user1795804的建议,我编写了以下测试代码
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 函数作为回调,以便它可以在系统事件引发时接收消息。但我在非窗口应用程序中找不到对应的。