Feat: copy selected message log rows to clipboard as CSV

This commit is contained in:
yuanyuanxiang
2026-06-11 21:34:42 +02:00
parent 3f662f1ca7
commit 2843a260b0
5 changed files with 39 additions and 1 deletions

View File

@@ -861,6 +861,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx)
ON_NOTIFY(NM_CUSTOMDRAW, IDC_MESSAGE, &CMy2015RemoteDlg::OnNMCustomdrawMessage) ON_NOTIFY(NM_CUSTOMDRAW, IDC_MESSAGE, &CMy2015RemoteDlg::OnNMCustomdrawMessage)
ON_NOTIFY(NM_RCLICK, IDC_MESSAGE, &CMy2015RemoteDlg::OnRClickMessage) ON_NOTIFY(NM_RCLICK, IDC_MESSAGE, &CMy2015RemoteDlg::OnRClickMessage)
ON_COMMAND(ID_MSGLOG_DELETE, &CMy2015RemoteDlg::OnMsglogDelete) ON_COMMAND(ID_MSGLOG_DELETE, &CMy2015RemoteDlg::OnMsglogDelete)
ON_COMMAND(ID_MSGLOG_COPY, &CMy2015RemoteDlg::OnMsglogCopy)
ON_COMMAND(ID_MSGLOG_CLEAR, &CMy2015RemoteDlg::OnMsglogClear) ON_COMMAND(ID_MSGLOG_CLEAR, &CMy2015RemoteDlg::OnMsglogClear)
ON_COMMAND(ID_ONLINE_ADD_WATCH, &CMy2015RemoteDlg::OnOnlineAddWatch) ON_COMMAND(ID_ONLINE_ADD_WATCH, &CMy2015RemoteDlg::OnOnlineAddWatch)
ON_COMMAND(ID_ONLINE_LOGIN_NOTIFY, &CMy2015RemoteDlg::OnOnlineLoginNotify) ON_COMMAND(ID_ONLINE_LOGIN_NOTIFY, &CMy2015RemoteDlg::OnOnlineLoginNotify)
@@ -8993,11 +8994,13 @@ void CMy2015RemoteDlg::OnRClickMessage(NMHDR* pNMHDR, LRESULT* pResult)
CMenu menu; CMenu menu;
menu.CreatePopupMenu(); menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING, ID_MSGLOG_DELETE, _TR("删除选中")); menu.AppendMenu(MF_STRING, ID_MSGLOG_DELETE, _TR("删除选中"));
menu.AppendMenu(MF_STRING, ID_MSGLOG_COPY, _TR("复制选中"));
menu.AppendMenu(MF_STRING, ID_MSGLOG_CLEAR, _TR("清空日志")); menu.AppendMenu(MF_STRING, ID_MSGLOG_CLEAR, _TR("清空日志"));
// 没有选中项时禁用"删除选中" // 没有选中项时禁用"删除选中"
if (m_CList_Message.GetSelectedCount() == 0) { if (m_CList_Message.GetSelectedCount() == 0) {
menu.EnableMenuItem(ID_MSGLOG_DELETE, MF_GRAYED); menu.EnableMenuItem(ID_MSGLOG_DELETE, MF_GRAYED);
menu.EnableMenuItem(ID_MSGLOG_COPY, MF_GRAYED);
} }
// 列表为空时禁用"清空日志" // 列表为空时禁用"清空日志"
if (m_CList_Message.GetItemCount() == 0) { if (m_CList_Message.GetItemCount() == 0) {
@@ -9023,6 +9026,38 @@ void CMy2015RemoteDlg::OnMsglogDelete()
} }
} }
void CMy2015RemoteDlg::OnMsglogCopy() {
POSITION pos = m_CList_Message.GetFirstSelectedItemPosition();
if (!pos) return;
CString csv;
int colCount = m_CList_Message.GetHeaderCtrl()->GetItemCount();
while (pos) {
int row = m_CList_Message.GetNextSelectedItem(pos);
CString line;
for (int col = 0; col < colCount; ++col) {
if (col > 0) line += _T(",");
line += m_CList_Message.GetItemText(row, col);
}
csv += line + _T("\r\n");
}
if (!OpenClipboard()) return;
EmptyClipboard();
int len = (csv.GetLength() + 1) * sizeof(TCHAR);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
if (hMem) {
memcpy(GlobalLock(hMem), (LPCTSTR)csv, len);
GlobalUnlock(hMem);
#ifdef UNICODE
SetClipboardData(CF_UNICODETEXT, hMem);
#else
SetClipboardData(CF_TEXT, hMem);
#endif
}
CloseClipboard();
}
void CMy2015RemoteDlg::OnMsglogClear() void CMy2015RemoteDlg::OnMsglogClear()
{ {
m_CList_Message.DeleteAllItems(); m_CList_Message.DeleteAllItems();

View File

@@ -538,6 +538,7 @@ public:
afx_msg void OnNMCustomdrawMessage(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnNMCustomdrawMessage(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnRClickMessage(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnRClickMessage(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnMsglogDelete(); afx_msg void OnMsglogDelete();
afx_msg void OnMsglogCopy();
afx_msg void OnMsglogClear(); afx_msg void OnMsglogClear();
afx_msg void OnOnlineAddWatch(); afx_msg void OnOnlineAddWatch();
afx_msg void OnNMCustomdrawOnline(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnNMCustomdrawOnline(NMHDR* pNMHDR, LRESULT* pResult);

View File

@@ -1746,6 +1746,7 @@ Ghostִ
代理=Proxy 代理=Proxy
勾选: 对下级隐藏 灰色: 上级已禁用=Checked: Hide from subordinates Gray: Disabled by upper level 勾选: 对下级隐藏 灰色: 上级已禁用=Checked: Hide from subordinates Gray: Disabled by upper level
删除选中=Delete Selected 删除选中=Delete Selected
复制选中=Copy Selected
清空日志=Clear Log 清空日志=Clear Log
FRPS 运行在本机=FRPS runs on localhost FRPS 运行在本机=FRPS runs on localhost
内网地址:=LAN Address: 内网地址:=LAN Address:

View File

@@ -1739,6 +1739,7 @@ Ghostִ
代理=代理 代理=代理
勾选: 对下级隐藏 灰色: 上级已禁用=勾選: 對下級隱藏 灰色: 上級已禁用 勾选: 对下级隐藏 灰色: 上级已禁用=勾選: 對下級隱藏 灰色: 上級已禁用
删除选中=刪除選中 删除选中=刪除選中
复制选中=复制選中
清空日志=清空日誌 清空日志=清空日誌
FRPS 运行在本机=FRPS 运行在本机 FRPS 运行在本机=FRPS 运行在本机
内网地址:=内網地址: 内网地址:=内網地址:

View File

@@ -977,7 +977,7 @@
#define ID_33040 33040 #define ID_33040 33040
#define ID_MSGLOG_CLEAR 33041 #define ID_MSGLOG_CLEAR 33041
#define ID_CANCEL_SHARE 33042 #define ID_CANCEL_SHARE 33042
#define ID_33043 33043 #define ID_MSGLOG_COPY 33043
#define ID_WEB_REMOTE_CONTROL 33044 #define ID_WEB_REMOTE_CONTROL 33044
#define ID_TOOL_PLUGIN_SETTINGS 33045 #define ID_TOOL_PLUGIN_SETTINGS 33045
#define ID_33046 33046 #define ID_33046 33046