VBoxClipboard.cpp revision b35e3948f1287430503b6b432945b8cf4bfd3a23
047031598fedf1cdfad53251da75021d27c07662vboxsync * VBoxClipboard - Shared clipboard
047031598fedf1cdfad53251da75021d27c07662vboxsync * Copyright (C) 2006-2010 Oracle Corporation
047031598fedf1cdfad53251da75021d27c07662vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
047031598fedf1cdfad53251da75021d27c07662vboxsync * available from http://www.virtualbox.org. This file is free software;
047031598fedf1cdfad53251da75021d27c07662vboxsync * you can redistribute it and/or modify it under the terms of the GNU
047031598fedf1cdfad53251da75021d27c07662vboxsync * General Public License (GPL) as published by the Free Software
047031598fedf1cdfad53251da75021d27c07662vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
047031598fedf1cdfad53251da75021d27c07662vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
047031598fedf1cdfad53251da75021d27c07662vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
047031598fedf1cdfad53251da75021d27c07662vboxsync// bool fOperational;
047031598fedf1cdfad53251da75021d27c07662vboxsync// uint32_t u32LastSentFormat;
047031598fedf1cdfad53251da75021d27c07662vboxsync// uint64_t u64LastSentCRC64;
047031598fedf1cdfad53251da75021d27c07662vboxsyncstatic char gachWindowClassName[] = "VBoxSharedClipboardClass";
047031598fedf1cdfad53251da75021d27c07662vboxsyncstatic int vboxClipboardChanged(VBOXCLIPBOARDCONTEXT *pCtx)
047031598fedf1cdfad53251da75021d27c07662vboxsync /* Query list of available formats and report to host. */
047031598fedf1cdfad53251da75021d27c07662vboxsync while ((format = EnumClipboardFormats (format)) != 0)
047031598fedf1cdfad53251da75021d27c07662vboxsync Log(("VBoxTray: vboxClipboardChanged: format = 0x%08X\n", format));
047031598fedf1cdfad53251da75021d27c07662vboxsync u32Formats |= VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT;
047031598fedf1cdfad53251da75021d27c07662vboxsync int cActual = GetClipboardFormatName(format, szFormatName, sizeof(szFormatName)/sizeof (TCHAR));
CloseClipboard ();
return rc;
(void) hwnd;
(void) uMsg;
(void) lResult;
static LRESULT vboxClipboardProcessMsg(VBOXCLIPBOARDCONTEXT *pCtx, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
switch (msg)
case WM_CHANGECBCHAIN:
Log(("VBoxTray: vboxClipboardProcessMsg: WM_CHANGECBCHAIN: hwndRemoved %p, hwndNext %p, hwnd %p\n", hwndRemoved, hwndNext, pCtx->hwnd));
rc = SendMessageTimeout(pCtx->hwndNextInChain, WM_CHANGECBCHAIN, wParam, lParam, 0, CBCHAIN_TIMEOUT, &dwResult);
if (!rc)
case WM_DRAWCLIPBOARD:
case WM_TIMER:
if (hViewer)
SendMessageCallback(hViewer, WM_CHANGECBCHAIN, (WPARAM)pCtx->hwndNextInChain, (LPARAM)pCtx->hwndNextInChain, CBChainPingProc, (ULONG_PTR) pCtx);
case WM_CLOSE:
case WM_RENDERFORMAT:
switch (format)
case CF_UNICODETEXT:
case CF_DIB:
if (cActual)
if (u32Format == 0)
Log(("VBoxTray: vboxClipboardProcessMsg: Unsupported clipboard format requested: %ld\n", u32Format));
const uint32_t cbPrealloc = 4096; /* @todo r=andy Make it dynamic for supporting larger text buffers! */
if (hMem)
Log(("VBoxTray: vboxClipboardProcessMsg: Locked pMem = %p, GlobalSize = %ld\n", pMem, GlobalSize(hMem)));
if (pMem)
Log(("VBoxTray: vboxClipboardProcessMsg: VbglR3ClipboardReadData returned with rc = %Rrc\n", vboxrc));
if (cb == 0)
if (hMem)
Log(("VBoxTray: vboxClipboardProcessMsg: Locked pMem = %p, GlobalSize = %ld\n", pMem, GlobalSize(hMem)));
if (pMem)
Log(("VBoxTray: VbglR3ClipboardReadData returned with rc = %Rrc, cb = %d, cbNew = %d\n", vboxrc, cb, cbNew));
if (hMem)
if (hMem)
if (hMem)
if (hClip)
if (hMem)
if (hMem)
case WM_RENDERALLFORMATS:
case WM_USER:
Log(("VBoxTray: vboxClipboardProcessMsg: WM_USER: Failed to open clipboard! Last error = %ld\n", GetLastError()));
Log(("VBoxTray: vboxClipboardProcessMsg: WM_USER: VBOX_SHARED_CLIPBOARD_FMT_HTML 0x%04X\n", format));
if (format != 0)
Log(("VBoxTray: vboxClipboardProcessMsg: WM_USER: hClip = %p, err = %ld\n", hClip, GetLastError ()));
Log(("VBoxTray: vboxClipboardProcessMsg: WM_USER: Failed to open clipboard! Last error = %ld\n", GetLastError()));
int vboxrc;
if (format != 0)
return rc;
return rc;
return VERR_NOT_SUPPORTED;
*pfStartThread = true;
return rc;
Log(("VBoxTray: VBoxClipboardThread: Failed to call the driver for host message! rc = %Rrc\n", rc));
Log(("VBoxTray: VBoxClipboardThread: VbglR3ClipboardGetHostMsg u32Msg = %ld, u32Formats = %ld\n", u32Msg, u32Formats));
switch (u32Msg)