Aplicativo que permite mostrar o conteúdo da área de transferência e seu tipo MIME?


9

Estou procurando um aplicativo que possa me mostrar os detalhes do conteúdo da área de transferência.

Ao copiar alguns dados na área de transferência, os dados são associados a um tipo MIME específico. O texto normal é que text/plainos dados binários podem ser copiados como application/octet-streametc. Eu tenho um aplicativo que copia dados binários, etiquetando-os como seu próprio tipo MIME, e gostaria de ver qual é o tipo e quais dados possui.

Não posso simplesmente colar o conteúdo da área de transferência em um aplicativo tipo bloco de notas de destino, porque o destino espera que seja o tipo MIME do objeto da área de transferência text/plain.

Um aplicativo que enumere todos os tipos de objetos MIME atualmente existentes na área de transferência também seria suficiente.

Respostas:


6

Use xclip:

xclip -o -t TARGETS

para ver todos os tipos disponíveis. Por exemplo:

  1. copiar algo do seu navegador
  2. investigar tipos disponíveis
$ xclip -o -t ALVOS
TIMESTAMP
ALVOS
MÚLTIPLO
text / html
text / _moz_htmlcontext
text / _moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
TEXTO
CORDA
text / x-moz-url-priv
  1. obtenha o conteúdo daquele em que você está interessado: xclip -o -t text/html

3

OK, eu realmente escrevi algum código que faz o que eu preciso. Ainda bem que é muito fácil no Qt.

As informações de construção estão na parte inferior desta postagem.

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)

Informações de construção, conforme solicitado no comentário por @slm: depende do sistema que você está usando. Esse código precisa do Qt5 e do CMake para compilar. Se você possui os dois, tudo o que você precisa fazer é executar:

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

ou 'gmake' se você estiver no FreeBSD ou 'mingw32-make' se você estiver no Windows, etc.

Se você não possui o Qt5 ou o CMake, pode tentar se safar do Qt4 e da compilação manual:

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

Se você estiver obtendo informações sobre a --std=c++11opção inválida , tente --std=c++0xe considere atualizar seu compilador;).


1
Obrigado por postar esta solução. Você poderia adicionar um pouco de detalhes sobre como compilá-lo para futuros visitantes?
slm

2
@slm, antonone, eu simplificado / encurtado seu código, também deve ser mais fácil para compilar dessa forma: gist.github.com/gsauthof/c955f727606f4a5b0cc2
maxschlepzig
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.