剪贴板(Clipboard)
应用之间的数据传输使用剪贴板。
1. 在剪贴板上粘贴文本数据。
首先,试着在剪贴板上粘贴文本数据吧。 节目如下所示。 能否顺利,可以用NotePad等文本编辑器确认。
2. 从剪贴板读取文本数据并显示。
从剪贴板读取文本数据后显示的程序如下所示。
用NotePad等文本编辑器粘贴文本后,运行这个程序的话,可以确认动作。
3. 从剪贴板上读取位图并显示。
从剪贴板读取位图后显示的程序如下所示。 截图后,运行这个程序的话,可以确认动作。
3. 从剪贴板读取位图并显示(2)
Windows OS标配的屏幕截图不会复制鼠标光标。 因此,我想捕捉剪贴板的形象,叠加鼠标光标。
虽然下一个项目还没有达到最终目标,但有时需要确认原理,所以会留作中途经过。
基本上和以前的程序clipboard03.c一样,但是周期性地重复了绘画。 这个程序没有判断是用PRTSC键进行全屏复制,还是用ALT键+PRTSC键捕捉活动窗口,首先,drawCursor的第2参数是TRUE,即活动窗口对应。
#include <windows.h>
void onPaint(HWND hwnd) {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
if (IsClipboardFormatAvailable(CF_BITMAP)) {
BITMAP bm;
OpenClipboard(hwnd);
HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
HDC hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap);
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
CloseClipboard();
}
EndPaint(hwnd, &ps);
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT umsg, WPARAM wp, LPARAM lp) {
switch (umsg) {
case WM_PAINT: onPaint(hwnd); return 0;
case WM_DESTROY: PostQuitMessage(0); return 0;
}
return DefWindowProc(hwnd, umsg, wp, lp);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
MSG msg;
WNDCLASS wc = { 0, WindowProc, 0, 0, hInst, NULL, LoadCursor(NULL,IDC_ARROW),
(HBRUSH)(COLOR_WINDOW+1), NULL, "Dem