Windows如何实现剪贴板格式转换?
how does Windows implement clipboard format conversion?
我正在 Windows 上为我的应用程序沙箱系统实现剪贴板。我必须自己模拟剪贴板行为。现在,除了格式转换部分外,一切正常,我可以为 CF_TEXT/UNICODETEXT/OEMTEXT 做这件事,但还有其他我不熟悉的格式,如 DIB。是否有任何示例代码说明 Windows 如何做到这一点?
CF_DIB
和其他剪贴板格式的区别在于它包含BITMAPINFO
结构和位图位的内存对象。
msdn document已经提供了非常详细的例子:
HINSTANCE hinst;
UINT uFormat = (UINT)(-1);
BOOL fAuto = TRUE;
LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam)
HWND hwnd;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
static HWND hwndNextViewer;
HDC hdc;
HDC hdcMem;
PAINTSTRUCT ps;
LPPAINTSTRUCT lpps;
RECT rc;
LPRECT lprc;
HGLOBAL hglb;
LPSTR lpstr;
HBITMAP hbm;
HENHMETAFILE hemf;
HWND hwndOwner;
switch (uMsg)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
// Branch depending on the clipboard format.
switch (uFormat)
{
case CF_OWNERDISPLAY:
...
case CF_BITMAP:
hdcMem = CreateCompatibleDC(hdc);
if (hdcMem != NULL)
{
if (OpenClipboard(hwnd))
{
hbm = (HBITMAP)
GetClipboardData(uFormat);
SelectObject(hdcMem, hbm);
GetClientRect(hwnd, &rc);
BitBlt(hdc, 0, 0, rc.right, rc.bottom,
hdcMem, 0, 0, SRCCOPY);
CloseClipboard();
}
DeleteDC(hdcMem);
}
break;
...
如果需要将获取的位图对象保存为文件,则必须严格按照BITMAPINFOHEADER structure赋值
MSDN 代码示例:Storing an Image
我正在 Windows 上为我的应用程序沙箱系统实现剪贴板。我必须自己模拟剪贴板行为。现在,除了格式转换部分外,一切正常,我可以为 CF_TEXT/UNICODETEXT/OEMTEXT 做这件事,但还有其他我不熟悉的格式,如 DIB。是否有任何示例代码说明 Windows 如何做到这一点?
CF_DIB
和其他剪贴板格式的区别在于它包含BITMAPINFO
结构和位图位的内存对象。
msdn document已经提供了非常详细的例子:
HINSTANCE hinst;
UINT uFormat = (UINT)(-1);
BOOL fAuto = TRUE;
LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam)
HWND hwnd;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
static HWND hwndNextViewer;
HDC hdc;
HDC hdcMem;
PAINTSTRUCT ps;
LPPAINTSTRUCT lpps;
RECT rc;
LPRECT lprc;
HGLOBAL hglb;
LPSTR lpstr;
HBITMAP hbm;
HENHMETAFILE hemf;
HWND hwndOwner;
switch (uMsg)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
// Branch depending on the clipboard format.
switch (uFormat)
{
case CF_OWNERDISPLAY:
...
case CF_BITMAP:
hdcMem = CreateCompatibleDC(hdc);
if (hdcMem != NULL)
{
if (OpenClipboard(hwnd))
{
hbm = (HBITMAP)
GetClipboardData(uFormat);
SelectObject(hdcMem, hbm);
GetClientRect(hwnd, &rc);
BitBlt(hdc, 0, 0, rc.right, rc.bottom,
hdcMem, 0, 0, SRCCOPY);
CloseClipboard();
}
DeleteDC(hdcMem);
}
break;
...
如果需要将获取的位图对象保存为文件,则必须严格按照BITMAPINFOHEADER structure赋值
MSDN 代码示例:Storing an Image