如何非窗口程序监控系统剪贴板
本文关键字:监控系统 剪贴板 程序 窗口 何非 | 更新日期: 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#"。