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. Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7

    昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Framework7 有哪些不同?现在开发到什么程度了? .今天,我们开学习全功能.NET(Full .NET)下使用EF ...

  2. Linux操作系统的种种集成开发环境

    Linux操作系统的种种集成开发环境 随着Linux的逐渐兴起,已经有为数众多的程序在上面驰骋了,许多开发环境(Development Environment)也应运而生.好的开发环境一定是集成了编辑 ...

  3. javascript比较两个时间大小

    //var yourtime=document.getElementById('begin_time').value; var yourtime='2010-12-10 11:12'; yourtim ...

  4. 用 Redis 实现分布式锁(分析)

    文章转自:http://www.jeffkit.info/2011/07/1000/ Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET ...

  5. js 操作select和option常用代码整理

    1.获取选中select的value和text,html代码如下: <select id="mySelect"> <option value="1&qu ...

  6. Nginx安装及配置文件解释

    安装nginx,还是在mac上面用brew比较方便. 首先,brew install nginx,提示改权限 sudo chown -R $(whoami) /usr/local 然后brew ins ...

  7. RV BaseRecyclerViewAdapterHelper 总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. mysql的安全性机制

    MySQL中主要包括两种用户:root用户和普通用户,其中前者为超级管理员,拥有MySQL提供的一切权限:而普通用户则只能拥有创建用户时赋予它的权限. MySQL的安全性机制主要包括权限机制,用户机制 ...

  9. mysql5.0.x统计每秒增删改查替换数及系统每秒磁盘IO

    转载自:http://blog.chinaunix.net/uid-9370128-id-393082.html 1. mysql 5.0.x 统计每秒增,删,改,查,替换数  mysql 的show ...

  10. 【Python】Django CSRF问题

    参考资料: Django Ajax CSRF 认证:http://www.ziqiangxuetang.com/django/django-csrf.html Python Post遇到csrftok ...