web-dev-qa-db-ja.com

Ctrl + CとCtrl + Vはどのように機能しますか?

イメージをコピー(選択して使用)すると、内部で(オペレーティングシステム内で)何が起こるのかといつも思っていました。 Ctrl+C)Wordファイルに(貼り付けて Ctrl+V)、 例えば。

100
Inter Sys

Windowsでは、クリップボードAPIとストレージバッファーは、OSによってカーネルレベルで提供されます。 (クリップボードは「ウィンドウステーション」カーネルオブジェクトに属します。)

  • Ctrl+C Win32 API関数 SetClipboardData() を使用して「コピーされた」データを保存するようにプログラムに指示します。これは、ネイティブAPIのNtUserSetClipboardData()にも対応します。

    通常、コピーされたデータはOSが管理するクリップボードバッファーにすぐに格納され、ソースプログラムに依存しなくなります。プログラムは、いくつかの異なる formats を提供できます。 MS Wordからコピーされたテキストは、HTML、RTF、およびプレーンテキスト形式で同時に提供されます。

    (ただし、プログラムmay「null」データを保存し、_WM_RENDERFORMAT_を使用して貼り付けが要求されるまで変換を延期します。この場合、プログラムを閉じるとデータが失われます。この方法は一般的です。)

  • Ctrl+VGetClipboardData() を使用して目的の形式を選択して取得するようにプログラムに指示します。いくつかのプログラム、例えばワードパッドまたはペイントには、「形式を選択して貼り付け」機能があり、好みのフォーマットを選択できます(たとえば、HTMLをコピーしたがフォーマットは必要ない場合)。

  • "NT Debugging:How the clipboard works" ブログ投稿も参照してください。

Linux、にはnoシステム全体のクリップボードがあり、代わりに使用しているグラフィカル環境(X11、Waylandなど)によって提供されます。

X11(必ずしもLinuxに限定されない)では、クリップボード転送は延期されます。つまり、ストレージは「ソース」プログラムによって提供されます。交換は、ICCCMプロトコルに従ってX11メッセージを介して行われます(したがって、クリップボードはXサーバーに分離されています)。

  • Ctrl+C 「コピーされた」データをits ownメモリに予約し、X11 selectionと呼ばれる「CLIPBOARD」を要求するようにソースプログラムに指示します。これはXSetSelectionOwner()を使用して行われ、所有権はXサーバー(Xorg)によって追跡されます。

    以前に何かをコピーしたことがある場合は、以前の選択の所有者にそのことが通知され、不要になったデータは破棄されます。

    プログラムを閉じると、コピーしたデータは失われます。 (クリップボードマネージャーを使用して、現在の選択を監視および複製することでこれを回避できます。)

  • Ctrl+V 宛先プログラムに、XGetSelectionOwner()を使用して「CLIPBOARD」選択の現在の所有者を検索するように指示し、XConvertSelection()を使用して優先タイプを直接尋ねます。次に、ソースプログラムは、要求された型にオンデマンドで変換された別のX11メッセージを介してデータを返します。 (可能なタイプのリストを返す特別なタイプもあります。)

  • 実用的な例については このリンク を参照してください。

(注:テキストを選択して「コピー」し、ミドルクリックを使用して貼り付ける場合も、メカニズムは同じですが、代わりに「PRIMARY」選択が使用されます。これが「X11選択」という用語の由来です。)

ウェイランドでは、実際にどのように機能するのか理解していませんが、プロトコルのドキュメントしかありません。

従来のテキストエディター(Vim、emacs、nano)には、独自の内部クリップボード(レジスター/キリング)があることがよくあります。また、X11クリップボードと統合することもしないこともあります。

macOSでは、「ペーストボードサーバー」と呼ばれるものが使用されているように見えます(これは、プログラムがMach APIを介して通信することを意味していると思います)。それ以外は、Windowsクリップボードのように動作し、現在コピーされているデータ自体を保存します。

私は画像にもっと興味があります。どうすれば簡単にコピーできますか

画像は、テキストやオーディオなどのバイナリデータのチャンクです。クリップボードは通常、OSに共通の形式で画像を保持します。 [〜#〜] bmp [〜#〜] Windowsでは、image/png Linuxでは。

そして、Linuxでは、X11クリップボードプロトコルにより、1つのXクライアントが他のクライアントに選択の異なる「エンコーディング」を提供でき、受信側のXクライアントはエンコーディングを選択すると、送信側のXクライアントは、選択内容を両方のクライアントが理解できる形式に変換します。少なくとも理論的には; GTKやQtのような最新のツールキットライブラリが多くの選択肢を提供しているかどうかはわかりません。

165
user1686