如何非窗口程序监控系统剪贴板

本文关键字:监控系统 剪贴板 程序 窗口 何非 | 更新日期: 2023-09-27 18:21:09

我想写一个程序来使用C#监控windows剪贴板。我找到了一些关于这个话题的帖子。根据线程如何在C#中监控剪贴板内容的更改?找到WPF窗口的句柄后,我用WPF编写了一个演示。在我找到的所有示例代码中,它们都是WinForm或WPF应用程序,它们与之交互的win32api需要窗口句柄作为参数。例如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函数作为回调,这样它就可以在系统事件发生时接收消息。但我在非窗口应用程序中找不到对应的应用程序。

如何非窗口程序监控系统剪贴板

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

此GetClipboardSequenceNumber不接受任何参数,根据Microsoft的说法,"系统为每个窗口站保留剪贴板的序列号。每当剪贴板的内容发生更改或剪贴板被清空时,这个数字就会增加。您可以跟踪这个值来确定剪贴板的内容是否发生了更改,并优化创建DataObjects。如果剪贴板渲染被延迟,则序列号不会增加,直到更改被渲染d."

这将满足您的要求"我想写一个程序来监控窗口剪贴板使用C#"。