c#端由于system.windows.form自带的剪切板功能太少,所以写了一个Helper类把接口转了出来。这样就可以用不同的uint的id了。

并且自带的剪切板必须执行在[STAThread]模式下,很麻烦

而c++端拷贝字符串由于编码问题,需要使用宽字符。否则会乱码

c#


ClipboardHelper

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace Hont.Win32
{
public static class ClipboardHelper
{
#region Win32 Interface
[DllImport("user32.dll")]
public static extern bool EmptyClipboard();
[DllImport("user32.dll", SetLastError = true)]
private extern static IntPtr SetClipboardData(uint format, IntPtr handle);
[DllImport("user32.dll")]
static extern IntPtr GetClipboardData(uint uFormat);
[DllImport("user32.dll")]
static extern bool IsClipboardFormatAvailable(uint format);
[DllImport("user32.dll", SetLastError = true)]
static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll", SetLastError = true)]
static extern bool CloseClipboard();
[DllImport("kernel32.dll")]
static extern IntPtr GlobalLock(IntPtr hMem);
[DllImport("kernel32.dll")]
static extern bool GlobalUnlock(IntPtr hMem); public const uint CF_UNICODETEXT = ;
#endregion public static bool CopyToClipboard(uint id, string content)
{
if (OpenClipboard(IntPtr.Zero))
{
EmptyClipboard();
IntPtr hmem = Marshal.StringToHGlobalUni(content);
var ptr = GlobalLock(hmem);
GlobalUnlock(ptr);
SetClipboardData(id, ptr);
CloseClipboard();
return true;
}
return false;
} public static string GetFromClipboard(uint id)
{
if (!IsClipboardFormatAvailable(id)) return null;
if (!OpenClipboard(IntPtr.Zero)) return null; string data = null;
var hGlobal = GetClipboardData(id);
if (hGlobal != IntPtr.Zero)
{
var lpwcstr = GlobalLock(hGlobal);
if (lpwcstr != IntPtr.Zero)
{
data = Marshal.PtrToStringAuto(lpwcstr);
GlobalUnlock(lpwcstr);
}
}
CloseClipboard(); return data;
}
}
}

Main

using System;

namespace ClipboardTest
{
class Program
{
//[STAThread]
static void Main(string[] args)
{
//ClipboardHelper.CopyToClipboard(90, "qweqweqwe");
var str = ClipboardHelper.GetFromClipboard();
Console.WriteLine(str);
Console.ReadLine();
}
}
}

c++


#include<Windows.h>
#include <iostream>
#include <windows.h>
#include <ctime>
#include <atlstr.h>
#include "stdafx.h" BOOL CopyStringToClipBoard(HWND hOwner, CString strSource)
{
if (::OpenClipboard(hOwner))
{
int buff_size = strSource.GetLength();
CStringW strWide = CStringW(strSource);
int nLen = strWide.GetLength();
HANDLE clipbuffer;
char* buffer;
::EmptyClipboard();
clipbuffer = ::GlobalAlloc(GMEM_DDESHARE, (nLen + ) * );
buffer = (char*)::GlobalLock(clipbuffer);
memset(buffer, , (nLen + ) * );
memcpy_s(buffer, nLen * , strWide.GetBuffer(), nLen * );
strWide.ReleaseBuffer();
::GlobalUnlock(clipbuffer);
::SetClipboardData(, clipbuffer);
::CloseClipboard();
}
return FALSE;
} BOOL GetTextFromClipboard()
{
if (::OpenClipboard(NULL))
{
HGLOBAL hMem = GetClipboardData();
if (NULL != hMem)
{
char* lpStr = (char*)::GlobalLock(hMem);
if (NULL != lpStr)
{
printf(lpStr);
::GlobalUnlock(hMem);
}
}
::CloseClipboard();
return TRUE;
}
return FALSE;
} int _tmain(int argc, _TCHAR* argv[])
{
CopyStringToClipBoard(NULL, "asdsad");
GetTextFromClipboard();
return ;
}

C++和C#实现剪切板数据交互的更多相关文章

  1. C++打开剪切板,获取剪切板数据

    if (::OpenClipboard(NULL) && ::IsClipboardFormatAvailable(CF_HDROP)) { HDROP hDrop = (HDROP) ...

  2. Javascript操作剪切板数据(支持IE、Chrome、360、搜狗),亲测!

    clipboarddata只能在IE浏览器中使用,在chrome下会提示对象未定义!以下的方法支持IE.Chrome.360.搜狗等浏览器,其它浏览器还未验证. <!DOCTYPE html&g ...

  3. Android剪切板传递数据传递序列化对象数据

    一.剪切板的使用介绍 1. 剪切板对象的创建 使用剪切板会用到,ClipboardManager对象,这个对像的创建不可以使用构造方法,主要是由于没有提供public的构造函数(单例模式),需要使用A ...

  4. c#操作剪切板

    C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有: Clear 清除剪切板中的所有数据: ContainsData,Conta ...

  5. ASP.NET MVC实现剪切板功能

    前言 关于复制粘贴的功能,好像不用劳师动众的写后端代码,JS就可以,但正如大家所知道的,兼容性问题,当然这么通用的功能怎么可能没有一个通用的方案呢,于是便找到了一款jquery插件 jquery.cl ...

  6. Android系统剪切板

    Android系统剪贴板 复制字符串到系统剪切板 /** * 复制文本到剪切板 * * @param text * @return */ @SuppressWarnings("depreca ...

  7. C# 使用WinApi操作剪切板Clipboard

    前言: 最近正好写一个程序,需要操作剪切板 功能很简单,只需要从剪切板内读取字符串,然后清空剪切板,然后再把字符串导入剪切板 我想当然的使用我最拿手的C#来完成这项工作,原因无他,因为.Net框架封装 ...

  8. C# 线程间不能调用剪切板的问题

    最近做一个项目,需要用到线程,而且要用到剪切板,创建了一个子线程之后发现在子线程中剪切板上获取不到数据,当时特别纳闷,上网查资料,最后终于搞定,现将解决方法归纳如下: 第一步: public void ...

  9. 【Windows API】OpenClipboard --- 剪切板(转)

    原文转自 http://www.cnblogs.com/wind-net/archive/2012/11/01/2749558.html 剪切板:系统维护的一个全局公共内存区域.每次只允许一个进程对其 ...

随机推荐

  1. USACO numtri 数塔问题

    /* ID:kevin_s1 PROG:numtri LANG:C++ */ #include <iostream> #include <cstdio> #include &l ...

  2. 实现SQL Server中的切割字符串SplitString函数

    有时我们要用到批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.没什么好说的,需要的朋友直接拿去用吧 SET ANSI_NULLS ON GO S ...

  3. Informatica 常用组件Source Qualifier之三 联接查询

    联接源数据 可以使用一个源限定符转换来联接来自多个关系表的数据.这些表必须能从相同的实例或数据库服务器访问.当映射使用相关的关系源时,您可以在一个源限定符转换中同时联接两个源.在会话期间,源数据库在传 ...

  4. Orchard运用 - 学习资源分享

    这段时间研究Orchard,看到一些资源十分有用. 比如国内还是有些牛人在分享心得,在此也广播一下给新手: JustRun对Orchard的一些代码分析 Orchard源码分析 Orchard中文社区 ...

  5. C#的四个基本技巧

    1.如果可能尽量使用接口来编程 .NET框架包括类和接口,在编写程序的时候,你可能知道正在用.NET的哪个类.然而,在这种情况下如果你用.NET支持的接口而不是它的类来编程时,代码会变得更加稳定.可用 ...

  6. 如何模拟登陆添加了CSRF保护的网站

    上次写了篇文章,内容是如何利用WebClient模拟登陆CSRF控制的网站,回复中有人还是不理解,现在另开一篇,打算说说用Python如何来登陆. 开写之前,先说下为什么webrequest不行,常规 ...

  7. 初始小R-安装启动与测试

    非常感谢<深入浅出数据分析>这本书让我有幸认识了R,多多少少的弥补了我心里对R语言.R分析.R工具的模糊认知,下面我们就来体验一下R语言的魅力吧!GO! 一:下载R R官方地址:http: ...

  8. MPMoviePlayerViewController 视频播放黑屏

    MPMoviePlayerViewController 视频播放黑屏 今天用视频做本地视频播放:使用 MPMoviePlayerViewController 老是出现黑屏: 结果发现是一个 很坑爹的问 ...

  9. js&jquery避免报错的方法

      CreateTime--2016年12月8日15:28:40Author:Marydonjs&jquery规避报错信息的两种方式 <script type="text/ja ...

  10. jsp基本语法总结

    一,用jsp脚本元素调用java代码 1,jsp表达式的应用 jsp表达式将值直接插入到输出中: <%= Java Expression %>  代表一个值 隐式对象,在使用jsp表达式的 ...