Unity獲取剪切板內容粘貼板圖片文件文字

最近做了一個發送消息的unity項目,需要訪問剪切板里面的圖片文字文件等,翻遍了網上的東西,看了不是需要導入System.Windows.Forms(關鍵導入了unity還不好用,只能用在純c#項目中),所以我看了下pyhton是否有比較好的,結果是可以用的,把項目打包成了exe,unity去調用這個exe就行了。代碼如下`using System;
using UnityEngine;
using UnityEngine.UI;
using System.Diagnostics;
using System.IO;
using System.Text;

public class HelpPCon : MonoBehaviour
{
[SerializeField]
///
/// 圖片信息父物體
///
Transform PicParent_N;

[SerializeField]
/// <summary>
/// 消息Content
/// </summary>
GameObject MsgContent_N;/// <summary>
/// 文字信息消息預設
/// </summary>
[SerializeField]
GameObject msgTxtPrfab;/// <summary>
/// 圖片信息消息預設
/// </summary>
[SerializeField]
GameObject msgTexturePrfab;
/// <summary>
/// 下方消息框
/// </summary>
[SerializeField]
InputField IFDDownMsg_N;
[SerializeField]
Button BtnHelpSend_N;
[SerializeField]
public Button BtnZhanTie_N;
void Awake()
{// 添加發送幫助數據按鈕點擊事件BtnHelpSend_N.onClick.AddListener(SendHelpData);// 添加粘貼數據按鈕點擊事件BtnZhanTie_N.onClick.AddListener(GetClipboardData);
}private void OnEnable()
{// 當界面激活時隱藏圖片內容HideTextureContant();
}private void Update()
{// 監聽按下 Ctrl + V,觸發粘貼數據操作if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.V)){GetClipboardData();}
}/// <summary>
/// 獲取剪貼板數據,根據數據類型處理不同的操作
/// </summary>
void GetClipboardData()
{GetClipboardData((str) =>{// 解析剪貼板數據ClipboardData clipboardData = MessageDataProxy.Single.GetClipData(str);switch (clipboardData.type){case "TEXT":// 如果是文本類型,則將文本顯示在消息框中IFDDownMsg_N.text = Encoding.UTF8.GetString(clipboardData.data);break;case "IMAGE":// 如果是圖片類型,則顯示圖片PicParent_N.gameObject.SetActive(true);for (int i = 0; i < PicParent_N.childCount; i++){// 找到未激活的子對象,加載圖片數據并顯示if (PicParent_N.GetChild(i).gameObject.activeSelf == false){PicParent_N.GetChild(i).GetComponent<RawImage>().texture = MessageDataProxy.Single.GetTextureFromByte(clipboardData.data);PicParent_N.GetChild(i).gameObject.SetActive(true);break;}}break;case "FILE_LIST":// 如果是文件列表類型,則嘗試加載文件為圖片MessageDataProxy.Single.LoadTextureFromFile(clipboardData.data, (b, t) =>{if (b){// 加載成功則顯示圖片PicParent_N.gameObject.SetActive(true);for (int i = 0; i < PicParent_N.childCount; i++){if (PicParent_N.GetChild(i).gameObject.activeSelf == false){PicParent_N.GetChild(i).GetComponent<RawImage>().texture = t;PicParent_N.GetChild(i).gameObject.SetActive(true);break;}}}else{// 加載失敗,輸出錯誤信息UnityEngine.Debug.LogError("粘貼板上的文件不是圖片格式");}});break;default:break;}});
}/// <summary>
/// 獲取剪貼板數據,并通過回調函數返回結果
/// </summary>
/// <param name="callback">處理剪貼板數據的回調函數</param>
void GetClipboardData(Action<string> callback)
{// 執行外部程序獲取剪貼板數據的路徑string pythonScriptPath = Application.streamingAssetsPath + "/ReadTex/ReadTex.exe";// 創建一個進程啟動信息對象ProcessStartInfo startInfo = new ProcessStartInfo();startInfo.FileName = pythonScriptPath;startInfo.UseShellExecute = false;startInfo.RedirectStandardOutput = true;startInfo.CreateNoWindow = true;using (Process process = Process.Start(startInfo)){// 等待并獲取輸出using (StreamReader reader = process.StandardOutput){string result = reader.ReadToEnd();callback?.Invoke(result); // 調用回調函數返回獲取的剪貼板數據}}
}/// <summary>
/// 隱藏圖片內容的容器及其子對象
/// </summary>
void HideTextureContant()
{PicParent_N.gameObject.SetActive(false);for (int i = 0; i < PicParent_N.childCount; i++){PicParent_N.GetChild(i).gameObject.SetActive(false);}
}/// <summary>
/// 當所有子物體都隱藏時,隱藏自身容器
/// </summary>
public void HideSelfIfChildHide()
{for (int i = 0; i < PicParent_N.childCount; i++){if (PicParent_N.GetChild(i).gameObject.activeSelf){return;}}PicParent_N.gameObject.SetActive(false);
}/// <summary>
/// 發送反饋消息,將文本和圖片信息添加到消息內容中
/// </summary>
void SendHelpData()
{// 添加文本消息if (!string.IsNullOrEmpty(IFDDownMsg_N.text)){GameObject msgTxt = GameObject.Instantiate(msgTxtPrfab);msgTxt.transform.SetParent(MsgContent_N.transform);msgTxt.GetComponent<Text>().text = IFDDownMsg_N.text;IFDDownMsg_N.text = "";}// 添加圖片消息for (int i = 0; i < PicParent_N.childCount; i++){if (PicParent_N.GetChild(i).gameObject.activeSelf){GameObject msgTexture = GameObject.Instantiate(msgTexturePrfab);msgTexture.transform.SetParent(MsgContent_N.transform);msgTexture.GetComponent<RawImage>().texture = PicParent_N.GetChild(i).GetComponent<RawImage>().texture;}}// 發送完成后隱藏圖片內容HideTextureContant();
}

}
using System;
using System.IO;
using System.Text;
using UnityEngine;

[System.Serializable]
public class ClipboardData
{
public string type; // 類型字段,用于標識數據類型
public byte[] data; // 數據字節數組
}

public class MessageDataProxy
{
static MessageDataProxy Single_;
public static MessageDataProxy Single
{
get
{
if (Single_ == null)
Single_ = new MessageDataProxy();
return Single_;
}
}

/// <summary>
/// 從JSON數據中獲取剪貼板數據對象
/// </summary>
/// <param name="jsondata">JSON格式的數據字符串</param>
/// <returns>剪貼板數據對象</returns>
public ClipboardData GetClipData(string jsondata)
{ClipboardData clipboardData = JsonUtility.FromJson<ClipboardData>(jsondata);return clipboardData;
}/// <summary>
/// 從字節數組中加載Texture2D對象
/// </summary>
/// <param name="imageBytes">圖像的字節數組數據</param>
/// <returns>加載后的Texture2D對象</returns>
public Texture2D GetTextureFromByte(byte[] imageBytes)
{Texture2D texture = new Texture2D(1, 1); // 創建一個空的Texture2D對象texture.LoadImage(imageBytes); // 加載圖像數據到Texture2Dreturn texture;
}/// <summary>
/// 從文件中異步加載Texture2D對象,并通過回調函數返回結果
/// </summary>
/// <param name="imageBytes">文件路徑的字節數組數據</param>
/// <param name="callback">加載完成后的回調函數,參數為是否成功加載和加載后的Texture2D對象</param>
public void LoadTextureFromFile(byte[] imageBytes, Action<bool, Texture2D> callback)
{string path = Encoding.UTF8.GetString(imageBytes); // 解析字節數組為文件路徑字符串if (path.EndsWith(".png") || path.EndsWith(".jpg")){callback?.Invoke(true, LoadTextureFromFile(path)); // 如果路徑合法,異步加載并調用回調函數}else{callback?.Invoke(false, null); // 如果路徑不合法,調用回調函數返回加載失敗}
}/// <summary>
/// 從指定路徑加載Texture2D對象
/// </summary>
/// <param name="path">圖像文件路徑</param>
/// <returns>加載后的Texture2D對象</returns>
public Texture2D LoadTextureFromFile(string path)
{// 讀取本地文件數據byte[] fileData = File.ReadAllBytes(path);// 創建一個新的Texture2D對象Texture2D texture = new Texture2D(2, 2);// 將圖片字節流數據加載到Texture2D對象中texture.LoadImage(fileData);// 返回Texture2D對象return texture;
}

}
python代碼如下`import win32clipboard
import json
import logging
import os
from PIL import Image
import io

設置日志記錄

logging.basicConfig(filename=‘clipboard_data.log’, level=logging.DEBUG,
format=‘%(asctime)s %(levelname)s %(message)s’)

clipboard_type_map = {
win32clipboard.CF_UNICODETEXT: “TEXT”,
win32clipboard.CF_DIB: “IMAGE”,
win32clipboard.CF_HDROP: “FILE_LIST”,
}
def get_clipboard_data():
try:
win32clipboard.OpenClipboard()
data = None
for clip_type in clipboard_type_map.keys():
try:
data = win32clipboard.GetClipboardData(clip_type)
if data:
data = (clipboard_type_map[clip_type], data)
break
except Exception as e:
logging.error(f"Error retrieving clipboard data: {e}“)
pass
win32clipboard.CloseClipboard()
if data is None:
logging.warning(“No data found in clipboard.”)
return (‘UNKNOWN’, None)
return data
except Exception as e:
logging.error(f"Clipboard operation failed: {e}”)
return (‘UNKNOWN’, None)

獲取剪切板中的內容

clipboard_data = get_clipboard_data()

在控制臺打印 JSON 數據

if clipboard_data[0] == ‘TEXT’:
non_utf8_string = clipboard_data[1]
utf8_bytes = non_utf8_string.encode(‘utf-8’)
# 將字節數據轉換為整數數組
byte_list = list(utf8_bytes)
text_json = {
‘type’: ‘TEXT’,
‘data’: byte_list
}
print(json.dumps(text_json, ensure_ascii=False, indent=4))
elif clipboard_data[0] == ‘IMAGE’:
byte_data = clipboard_data[1]
byteio = io.BytesIO(byte_data)
image = Image.open(byteio)
# 將字節數據轉換為整數數組
file_name = ‘clipboard_image.png’ # 圖片文件名,這里可以根據需要修改
# 獲取當前腳本文件的路徑
current_dir = os.path.dirname(os.path.abspath(file))
# 構建保存圖片的完整路徑
file_path = os.path.join(current_dir, file_name)
image.save(file_path)
with open(file_path, “rb”) as img_file:
byte_data = list(img_file.read())
image_json = {
‘type’: ‘IMAGE’,
‘data’: byte_data
}
print(json.dumps(image_json, ensure_ascii=False, indent=4))
elif clipboard_data[0] == ‘FILE_LIST’:
non_utf8_string = clipboard_data[1][0]
utf8_bytes = non_utf8_string.encode(‘utf-8’)
# 將字節數據轉換為整數數組

byte_list = list(utf8_bytes)
file_list_json = {'type': 'FILE_LIST','data': byte_list
}
print(json.dumps(file_list_json, ensure_ascii=False, indent=4))

else:
unknown_json = {
‘type’: ‘UNKNOWN’,
‘data’: None
}
print(json.dumps(unknown_json, ensure_ascii=False, indent=4))如果不會pyhton的可以點擊獲取源碼

`

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37353.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37353.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37353.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GMSB文章九:微生物的相關關系組間波動

歡迎大家關注全網生信學習者系列&#xff1a; WX公zhong號&#xff1a;生信學習者Xiao hong書&#xff1a;生信學習者知hu&#xff1a;生信學習者CDSN&#xff1a;生信學習者2 介紹 計算配對微生物在組間的相關關系波動情況進而評估不同分組的微生物狀態。secom_linear 函數…

線性表與順序存儲結構(下)

前言 接上文&#xff08;線性表與順序存儲結構&#xff08;上&#xff09;&#xff09;。 這些順序存儲結構的方法在順序表上下卷中已經提到過&#xff0c;但是有些許不同&#xff0c;可以為理解順序表提供更豐富的視角。&#xff08;不過最主要的區別在于順序表上下卷中的順…

機器人關節 viscous friction與結構阻尼

Viscous Friction&#xff08;粘性摩擦&#xff09; 定義&#xff1a;Viscous friction&#xff0c;也被稱為粘性摩擦或粘滯摩擦&#xff0c;是機器人關節在運動過程中由于接觸面之間的相互作用而產生的摩擦力。這種摩擦力與關節的運動速度有關&#xff0c;通常表現為速度越大&…

HarmonyOS開發實戰:分布式文件系統-hmdfs

分布式文件系統提供跨設備的文件訪問能力&#xff0c;適用于如下場景&#xff1a; 兩臺設備組網&#xff0c;A 設備可以無感讀取和修改 B 設備的文件。 邊緣服務器可以自動同步組網中多個嵌入式設備中的文件數據。 hmdfs 在分布式軟總線動態組網的基礎上&#xff0c;為網絡上…

Ubuntu添加系統字體

&#xff08;2024.6.30&#xff09; 系統字體保存路徑在/usr/share/fonts下&#xff0c;如果此目錄下缺少字體&#xff0c;則使用其他可視化api&#xff08;如Python的pygame庫&#xff09;的默認配置時可能會出現亂碼問題。 往Ubuntu中添加字體的方法 方法一&#xff1a;手…

Ant Design Vue:如何提升你的前端開發效率?

目錄 1. Ant Design Vue 簡介 1.1 特性概覽 1.2 安裝與配置 2. 常用組件及使用示例 2.1 Button 按鈕 2.2 Form 表單 2.3 Table 表格 2.4 Modal 對話框 3. 常見問題及解決方案 3.1 組件無法渲染 問題描述 解決方案 3.2 表單驗證失效 問題描述 解決方案 3.3 表格…

Python | 計算位渦平流項

寫在前面 最近忙著復習、考試…都沒怎么空敲代碼&#xff0c;還得再準備一周考試。。。等考完試再慢慢更新了&#xff0c;今天先來淺更一個簡單但是使用的python code 在做動力機制分析時&#xff0c;我們常常需要借助收支方程來診斷不同過程的貢獻&#xff0c;其中最常見的一…

51單片機-點亮LED燈

目錄 新建項目選擇型號添加新文件到該項目設置字體和utf-8編碼二極管如何區分正負極原理&#xff1a;CPU通過寄存器來控制硬件電路 用P2寄存器的值控制第一個燈亮進制轉換編譯查看P2寄存器的地址生成HEX文件把代碼下載到單片機中 新建項目 選擇型號 stc是中國生產的、這個里面…

token登錄比密碼登錄有什么優勢嗎

token登錄比密碼登錄有什么優勢嗎 使用令牌&#xff08;Token&#xff09;登錄相比于密碼登錄具有一些優勢&#xff0c;包括&#xff1a; 安全性&#xff1a;令牌通常采用加密技術&#xff0c;使得它們更難以被盜取或猜測。相比之下&#xff0c;密碼存在被猜測、破解或被暴力攻…

解決瀏覽器兼容性問題的方法

解決瀏覽器兼容性問題的方法 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們來探討如何解決網頁開發中常見的瀏覽器兼容性問題。隨著互聯網技術的發展&…

java中輸入輸出流的繼承關系

在 Java 中,輸入輸出流的繼承關系主要圍繞兩個抽象基類展開:字節流基類 InputStream 和 OutputStream,以及字符流基類 Reader 和 Writer。這些類形成了 Java I/O 系統的基礎,提供了豐富的子類以適應不同的輸入輸出需求。 字節流 字節流用于處理原始的二進制數據。 Input…

利用Linked SQL Server提權

點擊星標&#xff0c;即時接收最新推文 本文選自《內網安全攻防&#xff1a;紅隊之路》 掃描二維碼五折購書 利用Linked SQL Server提權 Linked SQL server是一個SQL Server數據庫中的對象&#xff0c;它可以連接到另一個SQL Server或非SQL Server數據源&#xff08;如Oracle&a…

初學者輕松搞定19個經典的Python程序以及代碼演示

Python的經典程序展示了Python語言基本特性和功能的簡單示例,這些程序在學習和理解Python編程語言的過程中起著至關重要的作用. 一些常見的經典Python程序及其在學習Python時的功能&#xff1a; 1.Hello, World! print("Hello, World!")解釋:這是Python的基本輸出…

primeflex overflow樣式類相關的用法和案例

文檔地址&#xff1a;https://primeflex.org/overflow 案例1 <script setup> import axios from "axios"; import {ref} from "vue";const message ref("frontend variable") axios.get(http://127.0.0.1:8001/).then(function (respon…

【Flink】Flink SQL

一、Flink 架構 Flink 架構 | Apache Flink 二、設置TaskManager、Slot和Parallelism 在Apache Flink中&#xff0c;設置TaskManager、Slot和Parallelism是配置Flink集群性能和資源利用的關鍵步驟。以下是關于如何設置這些參數的詳細指南&#xff1a; 1. TaskManager 設置 …

【漏洞復現】致遠互聯FE協作辦公平臺——SQL注入

聲明&#xff1a;本文檔或演示材料僅供教育和教學目的使用&#xff0c;任何個人或組織使用本文檔中的信息進行非法活動&#xff0c;均與本文檔的作者或發布者無關。 文章目錄 漏洞描述漏洞復現測試工具 漏洞描述 致遠互聯FE協作辦公平臺是一個專注于協同管理軟件領域的數智化運…

關于內存和外存文件不同字符集下占用空間大小問題

關于內存和外存不同字符集下文件占用空間大小問題 存儲&#xff08;外存&#xff09;的文件中的字符&#xff1a; ASCII&#xff1a;每個字符占用1個字節&#xff0c;用來存儲英文字符和常用標點符號。ISO-8859-1&#xff1a;每個字符占用1個字節&#xff0c;向下兼容ASCII。G…

DS18B20單總線數字溫度傳感器國產替代MY18E20 MY1820 MY18B20Z MY18B20L(一)

前言 DS18B20是全球第一個單總線數字溫度傳感器&#xff0c;推出時間已經超過30年&#xff0c;最早由美國達拉斯半導體公司推出&#xff0c;2001年1月&#xff0c;美信以25億美元收購達拉斯半導體&#xff08;Dallas Semiconductor&#xff09;&#xff0c;而美信在2021年8月被…

DM達夢數據庫存儲過程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;歡迎各位來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里不僅可以有所收獲&#xff0c;同時也能感受到一份輕松歡樂的氛圍&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

RDMA通信2:RDMA基本元素和組成 通信過程元素關系解析 視頻教程

哈哈哈&#xff0c;今天我們把下面這張圖理解了&#xff0c;我們的任務就完成了&#xff01; 視頻教程在這&#xff1a;1.2 RDMA基本元素和組成 通信過程元素關系解析_嗶哩嗶哩_bilibili 一、WQ和WQE 工作隊列元素(work queue element,WQE)&#xff1a;是軟件下發給硬件的任務…