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. 第八章openwrt 703N使用HUB(集线器)插U盘等设备

    在这里就要吐槽一下了,在网上一搜索竟然没有一篇详细的关于703N使用hub后挂载u盘的文章,想了很久问了别人还弄了一天晚上终于弄好了.好吧下面开始言归正传: 1.其实一般质量可以的集线器例如SSK这类 ...

  2. Node 多进程并发控制小模块 - lockman

    介绍 lockman 是一个用于多进程的并发控制锁, 类似一些语言中(比如 C#)的 lock 关键字可以用来确保代码块完成运行,而不会被其他进程中断.它可以把一段代码定义为互斥段(critical ...

  3. kvm安装windows系统

    1.创建虚拟机镜像文件并指定大小(10G) [root@centos01 ~]# qemu-img create -f raw /opt/windows20031.raw 10G Formatting ...

  4. 数据库插入数据返回当前自增主键ID值的方法

    当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用.我们通常的做法有如下几种: 1. 先 select max(id) +1 ,然后将+1后的值作为主键插入数据库: 2. ...

  5. Zclip:复制页面内容到剪贴板兼容各浏览器

    WEB开发中,要让用户复制页面中的一段代码.URL地址等信息,为了避免用户拖动鼠标再进行右键复制操作而可能出现的差错,我们可以直接在页面中放置一个复制按钮,只需要轻轻一点这个复制按钮,内容将会被复制, ...

  6. 【分布式计算】关于Hadoop、Spark、Storm的讨论

    参考资料: 与 Hadoop 对比,如何看待 Spark 技术?:https://www.zhihu.com/question/26568496 还要不要做大数据:http://sinofool.cn ...

  7. Java程序猿面试体会,还没找到工作的“猿猿们”看过来!

    类似的话题,我大约在几个月前跟大家聊过. 这一次,我要依据这段时间的体会,再给大家整理一下.     今天,非常轻松地拿到了神州数码的offer. 尽管工资不是特别高,尽管非常多人一毕业就能进入这种公 ...

  8. win7无法启动telnet服务

    右键我的电脑 —> 管理 —>服务,找到服务telnet, 右键—>属性—>依赖关系 就可以看到其他服务的依赖关系,打开相关依赖的服务即可解决服务不能启动的情况

  9. LoadRunner录制:脚本调试

    优化思路 1. 先录制 2. 然后进行清理.清理掉多余的cookie.lr_think_time等冗余脚本. 3. 调试脚本,让脚本可以跑通过. 4. 逐步优化添加 调试思路 1. 单用户单迭代 录制 ...

  10. UNIX网络编程读书笔记:pselect函数

    函数原型 pselect函数是由POSIX发明的,其原型如下: #include <sys/select.h> #include <signal.h> #include < ...