博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++和C#实现剪切板数据交互
阅读量:6070 次
发布时间:2019-06-20

本文共 4169 字,大约阅读时间需要 13 分钟。

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 = 13;        #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;        }    }}
View Code

 

Main

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

 

 

 

c++


 

#include
#include
#include
#include
#include
#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 + 1) * 2); buffer = (char*)::GlobalLock(clipbuffer); memset(buffer, 0, (nLen + 1) * 2); memcpy_s(buffer, nLen * 2, strWide.GetBuffer(0), nLen * 2); strWide.ReleaseBuffer(); ::GlobalUnlock(clipbuffer); ::SetClipboardData(90, clipbuffer); ::CloseClipboard(); } return FALSE;}BOOL GetTextFromClipboard(){ if (::OpenClipboard(NULL)) { HGLOBAL hMem = GetClipboardData(90); 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 0;}
View Code

 

转载于:https://www.cnblogs.com/hont/p/4189620.html

你可能感兴趣的文章
Codeforces Round #369 (Div. 2) C. Coloring Trees 动态规划
查看>>
ActiveMQ笔记(7):如何清理无效的延时消息?
查看>>
Linux系统文件访问控制列表
查看>>
js私有共有成员
查看>>
Linux 下 Shell 命令的分类及用法
查看>>
C# 中的 ref 和 out 的意义和使用方法
查看>>
相信自己,越活越坚强
查看>>
各种参数的响应时间
查看>>
phoenix将hdfs数据导入hbase
查看>>
phpstorm使用技巧
查看>>
Spark SQL在100TB上的自适应执行实践(转载)
查看>>
理解metrics.classification_report
查看>>
MongoDB学习笔记(一)安装配置
查看>>
Kafka配置项unclean.leader.election.enable造成consumer出现offset重置现象
查看>>
java运行jar命令提示没有主清单属性
查看>>
Objective-C编程基础
查看>>
centos开机自动运行[.sh]程序的方法
查看>>
BitBlt 注意事项(CAPTUREBLT) (转)
查看>>
Vitamio中文API文档(1)—— MediaStore
查看>>
博客园在百科上的介绍
查看>>