Skip to content

Clipboard

Clipboard reads and writes the Windows clipboard.


Clipboard

Static helper for Windows clipboard operations.

Usage::

Clipboard.set_text("hello world")
text = Clipboard.get_text()
img  = Clipboard.get_image()   # PIL.Image or None
Clipboard.clear()
Source code in src\dolphin_desktop\_clipboard.py
class Clipboard:
    """Static helper for Windows clipboard operations.

    Usage::

        Clipboard.set_text("hello world")
        text = Clipboard.get_text()
        img  = Clipboard.get_image()   # PIL.Image or None
        Clipboard.clear()
    """

    @staticmethod
    def get_text() -> str:
        """Read CF_UNICODETEXT from the clipboard; returns empty string if none."""
        import win32clipboard  # type: ignore[import-untyped]
        import win32con  # type: ignore[import-untyped]

        win32clipboard.OpenClipboard()
        try:
            try:
                return win32clipboard.GetClipboardData(win32con.CF_UNICODETEXT)
            except Exception:
                return ""
        finally:
            win32clipboard.CloseClipboard()

    @staticmethod
    def set_text(text: str) -> None:
        """Write *text* to the clipboard as CF_UNICODETEXT."""
        import win32clipboard  # type: ignore[import-untyped]
        import win32con  # type: ignore[import-untyped]

        win32clipboard.OpenClipboard()
        try:
            win32clipboard.EmptyClipboard()
            win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, text)
        finally:
            win32clipboard.CloseClipboard()

    @staticmethod
    def get_image():  # -> PIL.Image.Image | None
        """Read CF_DIB or CF_BITMAP from clipboard; returns None if not present."""
        import io

        import win32clipboard  # type: ignore[import-untyped]
        import win32con  # type: ignore[import-untyped]
        from PIL import Image, ImageGrab

        win32clipboard.OpenClipboard()
        try:
            if win32clipboard.IsClipboardFormatAvailable(win32con.CF_DIB):
                data = win32clipboard.GetClipboardData(win32con.CF_DIB)
                # CF_DIB is a BITMAPINFOHEADER + pixel data — wrap in BMP file header
                bmp_header = (
                    b"BM"
                    + (len(data) + 14).to_bytes(4, "little")
                    + b"\x00\x00\x00\x00"
                    + (14 + 40).to_bytes(4, "little")
                )
                return Image.open(io.BytesIO(bmp_header + data))
            if win32clipboard.IsClipboardFormatAvailable(win32con.CF_BITMAP):
                # Fallback: use ImageGrab which handles the conversion
                return ImageGrab.grabclipboard()
            return None
        except Exception:
            return None
        finally:
            win32clipboard.CloseClipboard()

    @staticmethod
    def clear() -> None:
        """Empty the clipboard."""
        import win32clipboard  # type: ignore[import-untyped]

        win32clipboard.OpenClipboard()
        try:
            win32clipboard.EmptyClipboard()
        finally:
            win32clipboard.CloseClipboard()

get_text staticmethod

get_text() -> str

Read CF_UNICODETEXT from the clipboard; returns empty string if none.

Source code in src\dolphin_desktop\_clipboard.py
@staticmethod
def get_text() -> str:
    """Read CF_UNICODETEXT from the clipboard; returns empty string if none."""
    import win32clipboard  # type: ignore[import-untyped]
    import win32con  # type: ignore[import-untyped]

    win32clipboard.OpenClipboard()
    try:
        try:
            return win32clipboard.GetClipboardData(win32con.CF_UNICODETEXT)
        except Exception:
            return ""
    finally:
        win32clipboard.CloseClipboard()

set_text staticmethod

set_text(text: str) -> None

Write text to the clipboard as CF_UNICODETEXT.

Source code in src\dolphin_desktop\_clipboard.py
@staticmethod
def set_text(text: str) -> None:
    """Write *text* to the clipboard as CF_UNICODETEXT."""
    import win32clipboard  # type: ignore[import-untyped]
    import win32con  # type: ignore[import-untyped]

    win32clipboard.OpenClipboard()
    try:
        win32clipboard.EmptyClipboard()
        win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, text)
    finally:
        win32clipboard.CloseClipboard()

get_image staticmethod

get_image()

Read CF_DIB or CF_BITMAP from clipboard; returns None if not present.

Source code in src\dolphin_desktop\_clipboard.py
@staticmethod
def get_image():  # -> PIL.Image.Image | None
    """Read CF_DIB or CF_BITMAP from clipboard; returns None if not present."""
    import io

    import win32clipboard  # type: ignore[import-untyped]
    import win32con  # type: ignore[import-untyped]
    from PIL import Image, ImageGrab

    win32clipboard.OpenClipboard()
    try:
        if win32clipboard.IsClipboardFormatAvailable(win32con.CF_DIB):
            data = win32clipboard.GetClipboardData(win32con.CF_DIB)
            # CF_DIB is a BITMAPINFOHEADER + pixel data — wrap in BMP file header
            bmp_header = (
                b"BM"
                + (len(data) + 14).to_bytes(4, "little")
                + b"\x00\x00\x00\x00"
                + (14 + 40).to_bytes(4, "little")
            )
            return Image.open(io.BytesIO(bmp_header + data))
        if win32clipboard.IsClipboardFormatAvailable(win32con.CF_BITMAP):
            # Fallback: use ImageGrab which handles the conversion
            return ImageGrab.grabclipboard()
        return None
    except Exception:
        return None
    finally:
        win32clipboard.CloseClipboard()

clear staticmethod

clear() -> None

Empty the clipboard.

Source code in src\dolphin_desktop\_clipboard.py
@staticmethod
def clear() -> None:
    """Empty the clipboard."""
    import win32clipboard  # type: ignore[import-untyped]

    win32clipboard.OpenClipboard()
    try:
        win32clipboard.EmptyClipboard()
    finally:
        win32clipboard.CloseClipboard()

Usage

from dolphin_desktop import Clipboard

# Text
Clipboard.set_text("hello")
text = Clipboard.get_text()     # "hello"

# Image
img = Clipboard.get_image()     # PIL.Image or None

# Clear
Clipboard.clear()

Notes

  • Uses win32clipboard (pywin32) - Windows only.
  • Locator.text() uses Clipboard internally as a fallback for controls that don't expose text via UIA (e.g., Windows 11 Notepad's Document control).
  • Clipboard is process-global. Parallel tests that use the clipboard simultaneously can interfere with each other - avoid parallel test runs that rely on clipboard operations.