概述
下面代码演示了如何把文本复制到剪贴板和如何从剪贴板获得文本
#include
<
windows.h
>
#include " resource.h "
#pragma comment(linker, "subsystem:windows") //使你可以打开此c源文件进行编译而不需设置工程设置,当然菜单资源还是要你自己建
// 过程函数的返回值都是LRESULT,类型都是CALLBACK
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd; // 主窗口句柄,在CreateWindow中赋值
MSG msg; // 消息变量,在GetMessage中使用
WNDCLASS wndclass; // 窗口类
TCHAR * szAppName = TEXT( " Clipboard " ); // 类名和窗口名
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 窗口背景
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); // 鼠标
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); // 图标
wndclass.lpszClassName = szAppName; // 类名
wndclass.cbClsExtra = 0 ; // 类的额外参数
wndclass.cbWndExtra = 0 ; // 窗口的额外参数.用于基于同一窗口类的窗口各自区分.
// 在自定义对话框类时必须指定为DLGWINDOWEXTRA的大小
wndclass.lpszMenuName = TEXT( " MAINMENU " ); // 菜单名.可以用作子窗口的id
wndclass.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
wndclass.lpfnWndProc = WndProc; // 窗口过程
wndclass.hInstance = hInstance; // 包含窗口过程的实例句柄
if ( ! RegisterClass( & wndclass) ) // 注册窗口类
return 0 ;
hwnd = CreateWindow( // 创建窗口
szAppName, // 窗口类名
szAppName, // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口风格
CW_USEDEFAULT, // 初始的x坐标
CW_USEDEFAULT, // 初始的y坐标
CW_USEDEFAULT, // 初始的宽度
CW_USEDEFAULT, // 初始的高度
NULL, // 父窗口
NULL, // 菜单
hInstance, // 和窗口相关的实例句柄
NULL // 额外参数
);
ShowWindow( hwnd,nCmdShow ); // 显示窗口
UpdateWindow( hwnd ); // 更新窗口
while ( GetMessage( & msg,NULL, 0 , 0 ) ) // 消息循环
{
TranslateMessage( & msg); // 将WM_XXXKEYXXX消息翻译为WM_CHAR消息
DispatchMessage( & msg); // 传递消息到窗口过程
}
return msg.wParam; // 返回
}
LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
static char * pText;
switch ( message )
{
case WM_INITMENUPOPUP:
EnableMenuItem(
(HMENU)wParam,
IDM_FILE_PASTE,
IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED);
return 0 ;
case WM_DESTROY:
PostQuitMessage( 0 );
return 0 ;
case WM_COMMAND:
switch ( LOWORD(wParam) )
{
case IDM_FILE_COPY:
{
HGLOBAL hglobal = GlobalAlloc(GMEM_MOVEABLE , 6 ); // 分配剪贴板数据的空间
if ( hglobal == NULL )
{
return 0 ;
}
pText = ( char * )GlobalLock(hglobal); // 取得操作刚分配了的空间的指针
lstrcpy(pText, " hello " ); // 把数据复制到该指针指向的空间
GlobalUnlock(hglobal);
OpenClipboard(hwnd); // 打开剪贴板
EmptyClipboard(); // 清空剪贴板
SetClipboardData(CF_TEXT, hglobal); // 真正把数据放到剪贴板
CloseClipboard(); // 关闭剪贴板
return 0 ;
}
case IDM_FILE_PASTE:
{
RECT rc;
HDC hdc = GetDC(hwnd);
HGLOBAL hglobal;
OpenClipboard(hwnd); // 打开剪贴板
hglobal = GetClipboardData(CF_TEXT); // 取得存放剪贴板数据的空间的句柄
if (hglobal == NULL)
{
return 0 ;
}
pText = ( char * )malloc(GlobalSize(hglobal)); // 分配空间以保存从剪贴板获得的数据
if ( pText == NULL )
{
return 0 ;
}
lstrcpy(pText, GlobalLock(hglobal)); // 真正从剪贴板获得数据
GlobalUnlock(hglobal); // GlobalLock与GlobalUnlock的调用要成对
CloseClipboard(); // OpenClipboard与CloseClipboard的调用要成对
GetClientRect(hwnd, & rc);
DrawText(hdc, pText, - 1 , & rc, DT_CENTER | DT_EXPANDTABS);
free(pText); // malloc与free的调用要成对
return 0 ;
}
}
}
return DefWindowProc( hwnd,message,wParam,lParam );
}
#include " resource.h "
#pragma comment(linker, "subsystem:windows") //使你可以打开此c源文件进行编译而不需设置工程设置,当然菜单资源还是要你自己建
// 过程函数的返回值都是LRESULT,类型都是CALLBACK
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd; // 主窗口句柄,在CreateWindow中赋值
MSG msg; // 消息变量,在GetMessage中使用
WNDCLASS wndclass; // 窗口类
TCHAR * szAppName = TEXT( " Clipboard " ); // 类名和窗口名
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 窗口背景
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); // 鼠标
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); // 图标
wndclass.lpszClassName = szAppName; // 类名
wndclass.cbClsExtra = 0 ; // 类的额外参数
wndclass.cbWndExtra = 0 ; // 窗口的额外参数.用于基于同一窗口类的窗口各自区分.
// 在自定义对话框类时必须指定为DLGWINDOWEXTRA的大小
wndclass.lpszMenuName = TEXT( " MAINMENU " ); // 菜单名.可以用作子窗口的id
wndclass.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
wndclass.lpfnWndProc = WndProc; // 窗口过程
wndclass.hInstance = hInstance; // 包含窗口过程的实例句柄
if ( ! RegisterClass( & wndclass) ) // 注册窗口类
return 0 ;
hwnd = CreateWindow( // 创建窗口
szAppName, // 窗口类名
szAppName, // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口风格
CW_USEDEFAULT, // 初始的x坐标
CW_USEDEFAULT, // 初始的y坐标
CW_USEDEFAULT, // 初始的宽度
CW_USEDEFAULT, // 初始的高度
NULL, // 父窗口
NULL, // 菜单
hInstance, // 和窗口相关的实例句柄
NULL // 额外参数
);
ShowWindow( hwnd,nCmdShow ); // 显示窗口
UpdateWindow( hwnd ); // 更新窗口
while ( GetMessage( & msg,NULL, 0 , 0 ) ) // 消息循环
{
TranslateMessage( & msg); // 将WM_XXXKEYXXX消息翻译为WM_CHAR消息
DispatchMessage( & msg); // 传递消息到窗口过程
}
return msg.wParam; // 返回
}
LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
static char * pText;
switch ( message )
{
case WM_INITMENUPOPUP:
EnableMenuItem(
(HMENU)wParam,
IDM_FILE_PASTE,
IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED);
return 0 ;
case WM_DESTROY:
PostQuitMessage( 0 );
return 0 ;
case WM_COMMAND:
switch ( LOWORD(wParam) )
{
case IDM_FILE_COPY:
{
HGLOBAL hglobal = GlobalAlloc(GMEM_MOVEABLE , 6 ); // 分配剪贴板数据的空间
if ( hglobal == NULL )
{
return 0 ;
}
pText = ( char * )GlobalLock(hglobal); // 取得操作刚分配了的空间的指针
lstrcpy(pText, " hello " ); // 把数据复制到该指针指向的空间
GlobalUnlock(hglobal);
OpenClipboard(hwnd); // 打开剪贴板
EmptyClipboard(); // 清空剪贴板
SetClipboardData(CF_TEXT, hglobal); // 真正把数据放到剪贴板
CloseClipboard(); // 关闭剪贴板
return 0 ;
}
case IDM_FILE_PASTE:
{
RECT rc;
HDC hdc = GetDC(hwnd);
HGLOBAL hglobal;
OpenClipboard(hwnd); // 打开剪贴板
hglobal = GetClipboardData(CF_TEXT); // 取得存放剪贴板数据的空间的句柄
if (hglobal == NULL)
{
return 0 ;
}
pText = ( char * )malloc(GlobalSize(hglobal)); // 分配空间以保存从剪贴板获得的数据
if ( pText == NULL )
{
return 0 ;
}
lstrcpy(pText, GlobalLock(hglobal)); // 真正从剪贴板获得数据
GlobalUnlock(hglobal); // GlobalLock与GlobalUnlock的调用要成对
CloseClipboard(); // OpenClipboard与CloseClipboard的调用要成对
GetClientRect(hwnd, & rc);
DrawText(hdc, pText, - 1 , & rc, DT_CENTER | DT_EXPANDTABS);
free(pText); // malloc与free的调用要成对
return 0 ;
}
}
}
return DefWindowProc( hwnd,message,wParam,lParam );
}
转载于:https://blog.51cto.com/xxkkff/26220
最后
以上就是痴情面包为你收集整理的剪贴板(上)的全部内容,希望文章能够帮你解决剪贴板(上)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复