Приложение, которое позволяет показывать содержимое буфера обмена и его тип MIME?


9

Я ищу приложение, которое может показать мне детали содержимого буфера обмена.

При копировании некоторых данных в буфер обмена данные связываются с конкретным типом MIME. Обычный текст text/plain, двоичные данные могут быть скопированы как application/octet-stream, и т. Д. У меня есть приложение, которое копирует двоичные данные, помечая их как свой собственный тип MIME, и я хотел бы увидеть, какой это тип и какие у него есть данные.

Я не могу просто вставить содержимое буфера обмена в целевое приложение, похожее на блокнот, потому что цель ожидает, что MIME-тип объекта буфера обмена будет text/plain.

Приложение, которое перечисляет все существующие в настоящее время типы MIME-объектов в буфере обмена, также будет достаточно.

Ответы:


6

Используйте xclip:

xclip -o -t TARGETS

чтобы увидеть все доступные типы. Например:

  1. скопируйте что-нибудь из своего веб-браузера
  2. исследовать доступные типы
$ xclip -o -t TARGETS
TIMESTAMP
ЦЕЛЕВЫЕ
НЕСКОЛЬКО
текст / html
текст / _moz_htmlcontext
текст / _moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
ТЕКСТ
STRING
текст / х-Мос-URL-собств
  1. получить содержимое для интересующего вас: xclip -o -t text/html

3

Хорошо, я на самом деле написал код, который делает то, что мне нужно. Хорошо, что это довольно легко в Qt.

Информация о строительстве находится внизу этого поста.

xclipshow.cpp:

#include <QApplication>
#include <QTimer>
#include <QClipboard>
#include <QMimeData>
#include <QDebug>
#include <QStringList>

class App: public QObject {
    Q_OBJECT
private:
    void main();
public:
    App(): QObject() { }
public slots:
    void qtmain() { main(); emit finished(); }
signals:
    void finished();
};

void App::main() {
    QClipboard *clip = QApplication::clipboard();

    for(QString& formatName: clip->mimeData()->formats()) {
        std::string s;
        s = formatName.toStdString();

        QByteArray arr = clip->mimeData()->data(formatName);
        printf("name=%s, size=%d: ", s.c_str(), arr.size());

        for(int i = 0; i < arr.size(); i++) {
            printf("%02x ", (unsigned char) arr.at(i));
        }

        printf("\n");
    }
}

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    App *task = new App();
    QObject::connect(task, SIGNAL(finished()), & app, SLOT(quit()));
    QTimer::singleShot(0, task, SLOT(qtmain()));
    return app.exec();
}

#include "xclipshow.moc"

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0.0)
project(xclipshow)
find_package(Qt5Widgets)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(SRC
    xclipshow.cpp)

add_definitions(-std=c++11)
add_executable(xclipshow ${SRC})
qt5_use_modules(xclipshow Widgets Core)

Сбор информации в соответствии с запросом в комментарии @slm: это зависит от системы, которую вы используете. Этот код требует Qt5 и CMake для компиляции. Если у вас есть оба, все, что вам нужно сделать, это запустить:

BUILD_DIR=<path to an empty temporary dir, which will contain the executable file>
SRC_DIR=<path to the directory which contains xclipshow.cpp>

$ cd $BUILD_DIR
$ cmake $SRC_DIR
$ make

или «gmake», если вы используете FreeBSD, или «mingw32-make», если вы используете Windows и т. д.

Если у вас нет Qt5 или CMake, вы можете попытаться обойтись без Qt4 и ручной компиляции:

$ moc xclipshow.cpp > xclipshow.moc
$ g++ xclipshow.cpp -o xclipshow `pkg-config --cflags --libs QtGui` -I. --std=c++11

Если вы получаете информацию о недопустимых --std=c++11параметрах, попробуйте --std=c++0xвместо этого и рассмотрите возможность обновления вашего компилятора;).


1
Спасибо за размещение этого решения. Не могли бы вы добавить немного подробностей о том, как скомпилировать его для будущих посетителей?
СЛМ

2
@slm, antonone, я упростила / сократила твой код, также должно быть проще скомпилировать этот путь: gist.github.com/gsauthof/c955f727606f4a5b0cc2
maxschlepzig
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.