C++和C#实现剪切板数据交互
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#实现剪切板数据交互的更多相关文章
- C++打开剪切板,获取剪切板数据
if (::OpenClipboard(NULL) && ::IsClipboardFormatAvailable(CF_HDROP)) { HDROP hDrop = (HDROP) ...
- Javascript操作剪切板数据(支持IE、Chrome、360、搜狗),亲测!
clipboarddata只能在IE浏览器中使用,在chrome下会提示对象未定义!以下的方法支持IE.Chrome.360.搜狗等浏览器,其它浏览器还未验证. <!DOCTYPE html&g ...
- Android剪切板传递数据传递序列化对象数据
一.剪切板的使用介绍 1. 剪切板对象的创建 使用剪切板会用到,ClipboardManager对象,这个对像的创建不可以使用构造方法,主要是由于没有提供public的构造函数(单例模式),需要使用A ...
- c#操作剪切板
C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有: Clear 清除剪切板中的所有数据: ContainsData,Conta ...
- ASP.NET MVC实现剪切板功能
前言 关于复制粘贴的功能,好像不用劳师动众的写后端代码,JS就可以,但正如大家所知道的,兼容性问题,当然这么通用的功能怎么可能没有一个通用的方案呢,于是便找到了一款jquery插件 jquery.cl ...
- Android系统剪切板
Android系统剪贴板 复制字符串到系统剪切板 /** * 复制文本到剪切板 * * @param text * @return */ @SuppressWarnings("depreca ...
- C# 使用WinApi操作剪切板Clipboard
前言: 最近正好写一个程序,需要操作剪切板 功能很简单,只需要从剪切板内读取字符串,然后清空剪切板,然后再把字符串导入剪切板 我想当然的使用我最拿手的C#来完成这项工作,原因无他,因为.Net框架封装 ...
- C# 线程间不能调用剪切板的问题
最近做一个项目,需要用到线程,而且要用到剪切板,创建了一个子线程之后发现在子线程中剪切板上获取不到数据,当时特别纳闷,上网查资料,最后终于搞定,现将解决方法归纳如下: 第一步: public void ...
- 【Windows API】OpenClipboard --- 剪切板(转)
原文转自 http://www.cnblogs.com/wind-net/archive/2012/11/01/2749558.html 剪切板:系统维护的一个全局公共内存区域.每次只允许一个进程对其 ...
随机推荐
- 解决kylin报错:java.lang.ArrayIndexOutOfBoundsException: -1
报错信息: -- ::, INFO [pool--thread-] cli.DictionaryGeneratorCLI: : Building snapshot of ENERGON_DM.DM_D ...
- poj3126--Prime Path(广搜)
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11751 Accepted: 6673 Descr ...
- OpenShift 容器日志和应用日志分离问题
一般来说应用日志和容器日志一样输出到console,这样oc logs的时候就能把所有的获取到,但这种模式下输出的日志比较多,问题定位不方便,更多的时候开发人员只想通过应用日志来查看定位问题就够了,所 ...
- 【Hibernate步步为营】--hql查询小介
HQL 是指Hibernate Query Language,它是Hibernate的查询语言,拥有一套自己的查询机制,它的查询语句和SQL非常类似.在使用的时候可以非常快上手.HQL提供了基本上SQ ...
- go语言基础之闭包的特点
所谓闭包就是一个函数“捕获”了和它在同一作用域的其它常量和变量.这就意味着当闭包被调用的时候,不管在程序什么地方调用,闭包能够使用这些常量或者变量.它不关心这些捕获了的变量和常量是否已经超出了作用域, ...
- 我的Mac必备软件
1.Svn工具: Cornerstone_v2.7.10 2.iPhone配置文件管理 iPhoneConfigUtility.dmg 3.有道 for mac http://cidian.youda ...
- MyReport报表引擎2.1.0.1新功能
MyReport报表引擎(免Flex开发集成版)的使用场合适用于以传统html构建的系统,希望集成MyReport报表引擎的报表预览.打印和报表设计功能,而且不须要进行Flex相关的二次开发的用户.M ...
- css 小问题解决方法整理
1,图片垂直居中: 设置包括图片的div:height=20px:line-height=20px. 设置图片vertical-align:middle 就可以. 2,行内块元素有3px bug,可通 ...
- 【转】TCP(协议号6)的方方面面
转:http://blog.sina.com.cn/s/blog_6002b97001018fxh.html 第一:TCP连接的建立(也就是所谓的三次握手)过程. 第一次握手:建立连接时,客户端发送s ...
- JUnit单元测试基础要点
JUnit单元测试基础要点 1.JUnit是一种测试代码的框架,测试的目的是:保证代码没错,而不是保证代码正确. 2.测试类一般不要和目标类放在一起,但编译成的class文件是放在一起的. 3.单元测 ...