VC使用剪切板实现两个应用程序之间的数据交互
2006-07-26 11:24
1206 查看
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消息,读取数据。两者通过关键字来保证数据的正确性。
//获得关键字
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消息,读取数据。两者通过关键字来保证数据的正确性。
相关文章推荐
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 转载---使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 安编程中使用handleMessage实现线程之间数据交互
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- Exchanger 实现两个伙伴线程之间的数据交互
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- C#使用委托(delegate)实现在两个form之间传递数据的方法
- VB中使用DDE实现两个应用程序之间的通讯
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 安卓使用aidl实现两个程序之间的数据交换
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动