windows 如何清除剪贴板中指定格式的数据?

flmtquvp  于 2023-05-01  发布在  Windows
关注(0)|答案(3)|浏览(166)

我把一些数据放入剪贴板,在我从剪贴板复制数据后,我想清除数据而不清除整个剪贴板。
就像这样:

wchar_t* buf=NULL;
if( OpenClipboard(NULL)!=0)
{
HANDLE hData = GetClipboardData( CF_UNICODETEXT );
buf = (wchar_t*)GlobalLock( hData );
GlobalUnlock( hData );
CloseClipboard();
return buf;
} 

//job is done, and now I want to clear only hData!

据我所知,EmptyClipboard()将清空所有内容!
先谢谢你了!

but5z9lq

but5z9lq1#

剪贴板一次只能保存一个IDataObject;该数据对象可以呈现多种数据格式,但它只是单个COM对象。唯一的方法是复制现有的数据对象(减去要删除的格式),并将其设置为剪贴板,以代替原始数据对象。

ig9co6j1

ig9co6j12#

我在想你为什么要这么做。我不是Windows编程的Maven,但无论如何我都会尝试回答,因为在我看来,这个问题已经被留下了“孤儿”,我可能会提供一些见解(希望我没有犯大错)。
据我所知,剪贴板意味着保存 * 一个 * 实体的几个 * 替代 * 表示(以不同的格式)。
只删除 * 一个 * 这样的表示的用例是什么?我会说,有意义的是要么删除所有的表示(通过EmptyClipboard()),要么不删除。
也许你认为剪贴板是用来保存不同类型的 * 几个实体 *,这就是为什么你正在寻找一个选择性删除。恐怕这是一种误解,并不能反映剪贴板的真实的用途。

c3frrgcw

c3frrgcw3#

我需要它,所以我编码它,“空,然后重新填充减去我想删除的”,崩溃的时候,真实的的InsideClipboard。exe没有崩溃,所以我一定是出了什么问题
https://github.com/FuPeiJiang/InsideClipboard.ah2
gui,不是库/函数
Ahkv 2,足够接近C
编辑:CF_BITMAP,CF_ENHMETAFILE,CF_PALETTE是HANDLE,不是内存地址,(崩溃的原因)
我需要一个GUI,但也许有人需要C代码,所以:

#include <string.h>
#include <windows.h>
#include <winuser.h>

#pragma comment(lib, "User32.lib")

typedef struct FORMAT_AND_DATA {
    UINT format;
    HGLOBAL data;
} FORMAT_AND_DATA;

void deleteClipboardFormat(UINT format) {
    OpenClipboard(GetClipboardOwner());

    FORMAT_AND_DATA *format_and_data = malloc(sizeof(FORMAT_AND_DATA)*(CountClipboardFormats()));

    size_t i=0;
    UINT clip_format = 0;
    while ((clip_format=EnumClipboardFormats(clip_format))) {
        if (clip_format==format) {
            continue;
        }

        HANDLE src = GetClipboardData(clip_format);
        if (GetLastError()) {
            continue;
        }

        size_t size;
        HGLOBAL copy = src;
        if (src==0) {
            //delayed rendering
        } else {
            switch (clip_format) {
                case CF_BITMAP:
                case CF_ENHMETAFILE:
                case CF_PALETTE:
                    //handle
                    break;
                default:
                    //memory
                    size = GlobalSize(src);
                    copy = GlobalAlloc(0x2, size);
                    void *dst=GlobalLock(copy);
                    memcpy(dst, src, size);
                    GlobalUnlock(copy);
                    break;
            }

        }

        format_and_data[i].format = clip_format;
        format_and_data[i].data = copy;

        ++i;
    }

    EmptyClipboard();
    for (size_t j = 0; j < i; ++j) {
        SetClipboardData(format_and_data[j].format, format_and_data[j].data);
    }
    CloseClipboard();

    free(format_and_data);
}

int main() {
    // I don't know if these numbers change so replace with your numbers
    deleteClipboardFormat(49338); // HTML FORMAT
    deleteClipboardFormat(49562); // text/html
    deleteClipboardFormat(49459); // image/svg+xml
    //-really inefficient, code your own to take an array of formats as input
}

相关问题