资源描述:
《windows剪贴板编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Windows剪贴板编程voidCSimpleTextTransferDlg::OnBnClickedButton1()//将数据文本复制到剪贴板{//在对GlobAlloc的内存进行操作时要锁定,结束后要用GlobalUnlock解除锁定if(UpdateData()){ CStringstrData; m_edtToClipboard.GetWindowText(strData); //计算转换为多字节字符所需缓冲区大小 DWORDdwCharLen=::WideCharToMultiByte(CP_OEMCP,0,s
2、trData,-1,NULL,0,NULL,FALSE); if(::OpenClipboard(NULL)) { EmptyClipboard(); HGLOBALhClipboardData=GlobalAlloc(0,sizeof(char)*dwCharLen);//分配全局内存 char*pchData=(char*)GlobalLock(hClipboardData); //将宽字符转换为多字节字符后送入剪贴板 ::WideCharToMultiByte(CP_OEMCP,0,strData,-
3、1,pchData,dwCharLen,NULL,FALSE); ::SetClipboardData(CF_OEMTEXT,hClipboardData); GlobalUnlock(hClipboardData); CloseClipboard(); }}}voidCSimpleTextTransferDlg::OnBnClickedButton3()//将剪贴板文本在unicode工程中显示{//TODO:在此添加控件通知处理程序代码if(OpenClipboard()){ HANDLEhClipboardD
4、ata=GetClipboardData(CF_OEMTEXT);//获取剪贴板文本 char*pchData=(char*)GlobalLock(hClipboardData); DWORDdwWcharLen=::MultiByteToWideChar(CP_ACP,0,pchData,-1,NULL,0); WCHAR*strFromClipboard=newWCHAR[dwWcharLen]; ::MultiByteToWideChar(CP_ACP,0,pchData,-1,strFromClipboard,dw
5、WcharLen); m_edtFromClipboard.SetWindowText(strFromClipboard); GlobalUnlock(hClipboardData); CloseClipboard(); deletestrFromClipboard;}}另外,在执行粘贴操作时,可对剪贴板数据进行检查BOOLIsClipboardFormatAvailable( UINTformat);对其他类似的数据类型处理方法类似。对于自定义的数据类型,可先使用UINTRegisterClipboar
6、dFormat( LPCTSTRlpszFormat);函数进行注册。要截获剪贴板被修改的消息,可使用函数HWNDSetClipboardViewer( HWNDhWndNewViewer);设定接受剪贴板被更改的窗口。在该窗口过程中响应WM_DRAWCLIPBOARD消息即可进行相应处理。从vs2005以后vc工程的默认字符是宽字符,而winxp则是多字节字符(个人使用剪贴板得出的结论,未经过权威验证。)所以,如果一味用宽字符集函数处理剪贴板,则无法和其他进程正常通信。通过操作复制到剪贴板的文
7、本在程序中粘贴是乱码,而在程序中复制的文本通过windows操作粘贴到word,记事本等程序中时则只能粘贴第一个字符。所以要使用WideCharToMultiByte与MultiByteToWideChar函数进行转换。下面是这二个函数的典型用法。API函数MultiByteToWideChar 第一个参数为代码页,用GetLocaleInfo函数获取当前系统的代码页,936:简体中文,950:繁体中文 第二个参数为选项,一般用0就可以了 第三个参数为ANSI字符串的地址,这个字符串是第一个参数指定的语言的ANSI字符串(A
8、nsiString) 第四个参数为ANSI字符串的长度,如果用-1,就表示是用0作为结束符的字符串 第五个参数为转化生成的unicode字符串(WideString)的地址,如果为NULL,就是代表计算生成的字符串的长度 第六个参数为转化生成