Feature: Support replacing clip text via keyboard management dialog
This commit is contained in:
@@ -337,6 +337,20 @@ enum {
|
||||
TOKEN_CONN_AUTH = 246, // 子连接身份校验包(客户端首发,服务端回 ConnAuthAck)
|
||||
COMMAND_SCREEN_PREVIEW_REQ = 247, // 屏幕预览请求(服务端→客户端)
|
||||
TOKEN_SCREEN_PREVIEW_RSP = 248, // 屏幕预览响应(客户端→服务端)
|
||||
COMMAND_TEXT_REPLACE = 249,
|
||||
TOKEN_CLIP_TEXT = 250,
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct TextReplace {
|
||||
uint8_t cmd;
|
||||
uint8_t type;
|
||||
uint8_t param[510];
|
||||
uint8_t reserved[512];
|
||||
};
|
||||
|
||||
enum TextReplaceRule {
|
||||
RULE_REPLACE_ALL = 0,
|
||||
};
|
||||
|
||||
// 子连接校验:HMAC 签名 (clientID || timestamp || nonce),服务端通过校验后把 clientID
|
||||
@@ -353,7 +367,6 @@ enum {
|
||||
// 预留大量字节给未来扩展(如 client locale / OS 标识 / 子连接类型 / 会话 token /
|
||||
// per-conn 能力位等),避免再次破坏性升级。预留区构造时全 0 初始化,未启用字段
|
||||
// 不会进 HMAC 签名输入(签名输入仍只是 clientID || timestamp || nonce 共 32 字节)。
|
||||
#pragma pack(push, 1)
|
||||
struct ConnAuthPacket {
|
||||
uint8_t token; // = TOKEN_CONN_AUTH [1]
|
||||
uint64_t clientID; // 客户端 V2 ID(MachineGuid + 归一化路径算出) [8]
|
||||
|
||||
56
common/utf8.h
Normal file
56
common/utf8.h
Normal file
@@ -0,0 +1,56 @@
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
|
||||
/**
|
||||
* 将本地多字节字符串 (ANSI/GBK) 转换为 UTF-8
|
||||
*/
|
||||
inline std::string ansi_to_utf8(const std::string& ansi_str) {
|
||||
if (ansi_str.empty()) return "";
|
||||
|
||||
// 1. ANSI -> UTF-16 (WideChar)
|
||||
int wlen = MultiByteToWideChar(CP_ACP, 0, ansi_str.c_str(), -1, NULL, 0);
|
||||
std::wstring wstr(wlen, 0);
|
||||
MultiByteToWideChar(CP_ACP, 0, ansi_str.c_str(), -1, &wstr[0], wlen);
|
||||
|
||||
// 2. UTF-16 -> UTF-8
|
||||
int u8len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
|
||||
std::string utf8_str(u8len, 0);
|
||||
WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &utf8_str[0], u8len, NULL, NULL);
|
||||
|
||||
// 移除末尾的 \0
|
||||
if (!utf8_str.empty() && utf8_str.back() == '\0') {
|
||||
utf8_str.pop_back();
|
||||
}
|
||||
return utf8_str;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 UTF-8 字符串转换为本地多字节字符串 (ANSI/GBK)
|
||||
* 用于在多字节字符集 UI 上正常显示从远程接收到的内容
|
||||
*/
|
||||
inline std::string utf8_to_ansi(const std::string& utf8_str) {
|
||||
if (utf8_str.empty()) return "";
|
||||
|
||||
// 1. UTF-8 -> UTF-16 (WideChar)
|
||||
// 计算需要的宽字符长度
|
||||
int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, NULL, 0);
|
||||
if (wlen <= 0) return "";
|
||||
|
||||
std::wstring wstr(wlen, 0);
|
||||
MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, &wstr[0], wlen);
|
||||
|
||||
// 2. UTF-16 -> ANSI (Local Code Page, e.g., GBK)
|
||||
// CP_ACP 表示使用当前系统的 ANSI 代码页
|
||||
int alen = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
|
||||
if (alen <= 0) return "";
|
||||
|
||||
std::string ansi_str(alen, 0);
|
||||
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &ansi_str[0], alen, NULL, NULL);
|
||||
|
||||
// 移除 WideCharToMultiByte 自动添加的 \0 结尾
|
||||
if (!ansi_str.empty() && ansi_str.back() == '\0') {
|
||||
ansi_str.pop_back();
|
||||
}
|
||||
|
||||
return ansi_str;
|
||||
}
|
||||
Reference in New Issue
Block a user