C++和C#实现剪切板数据交互
生活随笔
收集整理的這篇文章主要介紹了
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 = 13;#endregionpublic 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<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 + 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
總結
以上是生活随笔為你收集整理的C++和C#实现剪切板数据交互的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openfire安装配置完全教程
- 下一篇: word break