Microsoftエンジニア、ベストを尽くしたWindowsクリップボード履歴の最適化を語る

[PR]記事内のアフィリエイトリンクから収入を得る場合があります
  • URLをコピーしました!

Microsoftの上級エンジニアRaymond Chen氏が、自身のブログ記事「The Old New Thing」を更新し、Windowsのクリップボード履歴が、他のクリップボードマネージャーとどのように違うのかその最適化の秘密を説明しています(Neowin)。

Windows 11や10には、「Win+V」を押して、クリップボード履歴にアクセスすることができる機能が標準で搭載されています。Chen氏はクリップボード履歴に3つの文字列を次々とセットするプログラムサンプルを掲載し、このプログラムを実行しても、最後の文字列がクリップボード履歴に残ることになると述べています。

// All error checking elided for expository purposes
#include 

void SetClipboardText(HWND hwnd, PCWSTR text)
{
    OpenClipboard(hwnd);
    EmptyClipboard();
    auto size = sizeof(wchar_t) * (1 + wcslen(text));
    auto clipData = GlobalAlloc(GMEM_MOVEABLE, size);
    auto buffer = (LPWSTR)GlobalLock(clipData);
    strcpy_s(buffer, size, text);
    GlobalUnlock(clipData);
    SetClipboardData(CF_UNICODETEXT, clipData);
    CloseClipboard();
}

// Put these strings in the clipboard history for quick access.
static constexpr PCWSTR messages[] = {
    L"314159", // the bug number we want to edit
    L"e83c5163316f89bfbde7d9ab23ca2e25604af290", // the commit to link the bug to
    L"Widget polarity was set incorrectly.", // the comment to add
};

int wmain([[maybe_unused]] int argc,
          [[maybe_unused]] wchar_t* argv[])
{
    auto tempWindow = CreateWindowExW(0, L"static", nullptr, WS_POPUPWINDOW,
            0, 0, 0, 0, nullptr, nullptr, nullptr, nullptr);

    for (auto message : messages)
    {
        SetClipboardText(tempWindow, message);
    }
    DestroyWindow(tempWindow);
    return 0;
}

記事によると、これは、Windowsのクリップボード履歴が、AddClipboardFormatListener関数とWM_CLIPBOARDUPDATEメッセージ識別子を使ってクリップボードの変更を非同期で追跡しているためです。リスナーに非同期で通知されるため、WM_CLIPBOARDUPDATEメッセージを受信するまでに、クリップボードが変更されている可能性があるです。

同期的に動作するクリップボードビューワーと異なり、クリップボードの変更を見逃す可能性がありますが、小さな変更を無視し、本当に重要な最後の1つだけを残すことは理にかなっており、パフォーマンス上のメリットもあると考えられます。

ありふれた機能のように思える「Win+V」機能ですが、OSのパフォーマンスに影響を与えないような細かな配慮が行われていることがわかります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次