Windowsでテキストやファイルをコピー&ペーストする際は「クリップボード」と呼ばれる領域にデータが格納されます。このクリップボードに保存できるデータの最大サイズやコピー&ペーストの仕組みについてWindowsの主要開発者であるレイモンド・チェン氏が解説しています。

Is there a maximum size for Windows clipboard data? Because I'm getting null for something I know should be there - The Old New Thing

https://devblogs.microsoft.com/oldnewthing/20220608-00/?p=106727

チェン氏がクリップボードについての解説を投稿した理由は、あるユーザーの質問にあります。そのユーザーは30万行超えの巨大なExcelファイルのセルをコピー&ペーストしようとしたものの、失敗してしまったとのこと。Windowsではクリップボードの中身を取得する際に関数「Get­Clipboard­Data」が使われますが、ユーザーが分析した結果30万行超えExcelファイルのセルをコピーしようとすると「Get­Clipboard­Data」の実行が失敗していることが判明しました。このことからユーザーは「Excelのデータが大きすぎるためクリップボードへのデータ格納が失敗した」と考え、チェン氏にクリップボードに保存可能な最大サイズを質問しました。

チェン氏は上記の質問に対して「Windowsではクリップボードに格納可能なデータの最大容量を設定しておらず、格納可能データ容量は使用可能なメモリ容量に依存しています」と回答しています。さらに、上記のExcelデータのコピー&ペースト失敗は「クリップボードへ格納可能なデータ容量」ではなく、別の原因が関係していると指摘しています。



Windowsで動作するアプリケーションがクリップボードにデータを格納する方法は2種類あります。1つはクリップボードに直接データを格納する方法で、もう1つがクリップボードにはデータを格納せず「クリップボードが呼び出される際にアプリケーションにデータの出力を要求する」という指令を与える方法です。後者の方法は「遅延レンダリング」と呼ばれており、Excelではリッチテキストをコピーする際に遅延レンダリングを用いているとのこと。

Windowsはクリップボードの中身を取得する「Get­Clipboard­Data」が実行された際に、データが返ってくるまで最大30秒待機しますが、待機時間が30秒を超えると「Get­Clipboard­Data」からは失敗を意味するNULLが返ってきます。つまり、上記のユーザーの場合はExcelデータのサイズが大きすぎるため遅延レンダリングに30秒以上の時間がかかり、コピー&ペーストに失敗したというわけです。

チェン氏は「30秒」というタイムアウト時間を延長する方法を今後解説予定とのことです。