VC使用剪切板实现两个应用程序之间的数据交互

本文介绍了一种利用OLE剪切板在两个应用程序之间进行数据交互的方法。A程序将关键字转换为自定义格式并发送,B程序接收并处理数据后,将其放到标准剪切板。A程序通过监听剪切板事件读取B程序返回的数据,通过关键字验证数据的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:A程序使用OLE剪切板,作为数据发送 
  //获得关键字
 CTime time;
 time=CTime::GetCurrentTime();   //获得当前时间
 strDownFlag=_wtoi(time.Format("%d%H%M%S"));   //将日,时,分,秒转换为关键字

 //将关键字使用自定义格式做为拖放源
 UINT format = RegisterClipboardFormat(_T("MY_FORMAT")); 
 HGLOBAL clipbuffer;
 clipbuffer = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT | GMEM_DISCARDABLE, sizeof(strDownFlag));
 long * buffer=(long*)GlobalLock(clipbuffer);
 *buffer = strDownFlag; //保存到内存
 GlobalUnlock(clipbuffer);

 //设置拖放
 m_DataSource.CacheGlobalData(format, clipbuffer);
 m_DataSource.DoDragDrop();

2:B程序接收OLE剪切板数据,处理后发送数据到标准剪切板
//判断剪切板格式
 HGLOBAL hMem;
 UINT format = RegisterClipboardFormat(_T("MY_FORMAT")); 
 UINT reformat=RegisterClipboardFormat(_T("MY_REFORMAT"));
 if(pDataObject->IsDataAvailable(format))
 {
//取得数据
  hMem = pDataObject->GetGlobalData(format);
  long* fgd = (long*) GlobalLock(hMem);
  GlobalUnlock(hMem);

//处理,获得相关返回信息
  struct MyFormatData
  {
   long idval;
   TCHAR  strLocalPath[MAX_PATH]; 
  };
  MyFormatData * mydata=new MyFormatData();
  mydata->idval=*fgd;
  TCHAR szLocDirectory[MAX_PATH];
  ::GetCurrentDirectory(MAX_PATH,mydata->strLocalPath);

//将数据保存到标准剪切板
if(OpenClipboard(NULL))
  {
   HGLOBAL clipbuffer;
   EmptyClipboard();
   clipbuffer = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT | GMEM_DISCARDABLE, sizeof(MyFormatData));
   MyFormatData * buffer=(MyFormatData*)GlobalLock(clipbuffer);
   *buffer = *mydata; //保存到内存
   GlobalUnlock(clipbuffer);
   SetClipboardData(reformat,clipbuffer);
   CloseClipboard();
  }  
 }

3:A程序从标准剪切板读数据
 (使用SetClipboardViewer(),然后响应ON_WM_DRAWCLIPBOARD)
 
//判断剪切板格式
 UINT format = RegisterClipboardFormat(_T("MY_REFORMAT"));
 MyFormatData data;
 if(OpenClipboard())
 {
  HANDLE hData =GetClipboardData(format);

 //如果剪切板内存在这样的数据,则取值
  if(hData)      
 {
   MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
   data = *buffer;
   GlobalUnlock(hData);
   EmptyClipboard();  
   CloseClipboard(); 
 
//判断当前关键字。确认是当前发出的信息 
  if(data.idval==strDownFlag)  
   {

    //取得相关信息,处理
    szLocalDirectory=data.strLocalPath;
    m_thread.BeginThread(Down,(LPVOID)&data);
   }
   return;
  }
  CloseClipboard(); 
 }

以上是当A程序拖放数据到B程序后,取得B程序的相关信息,返回给A,然后由A进行数据传送。这是我公司一人写的两个程序,但后来修改,要实现他们之间的交互。又懒得全部重写,所以使用了该方法来完成,希望可以让别人少费点时间。如果要实现两个应用程序之间的交互,将A,B两程序都加入到剪切板侦听链,注册两个剪切板格式。一程序将数据保存到剪切板,一程序响应WM_DRAWCLIPBOARD消息,读取数据。两者通过关键字来保证数据的正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值