3

我想编写一个程序来使用 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 函数作为回调,以便它可以在系统事件引发时接收消息。但我在非窗口应用程序中找不到对应的。

4

1 回答 1

1

据微软称,“监视剪贴板更改的方法有三种。最古老的方法是创建剪贴板查看器窗口。Windows 2000 增加了查询剪贴板序列号的功能,Windows Vista 增加了对剪贴板格式侦听器的支持。剪贴板支持查看器窗口以向后兼容早期版本的 Windows。新程序应使用剪贴板格式侦听器或剪贴板序列号。

这个 GetClipboardSequenceNumber 不带任何参数,根据微软的说法,“系统为每个窗口站的剪贴板保留一个序列号。每当剪贴板的内容发生变化或剪贴板被清空时,这个数字就会增加。你可以跟踪这个值来判断剪贴板内容是否发生变化,优化创建DataObjects。如果剪贴板渲染延迟,序列号不会增加,直到变化被渲染。

这将满足您“我想编写一个程序来使用 C# 监视 Windows 剪贴板”的要求。

于 2013-07-04T03:27:24.387 回答