4 Commits

7 changed files with 211 additions and 20 deletions

Binary file not shown.

View File

@@ -747,6 +747,66 @@ void CMy2015RemoteDlg::RecordDllRequest(const std::string& ip)
m_DllRequestTimes[ip].push_back(time(nullptr)); m_DllRequestTimes[ip].push_back(time(nullptr));
} }
// ─── CSplitterBar ────────────────────────────────────────────────────────────
BEGIN_MESSAGE_MAP(CSplitterBar, CWnd)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_SETCURSOR()
ON_WM_PAINT()
END_MESSAGE_MAP()
BOOL CSplitterBar::Create(CWnd* pParent)
{
CString cls = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
::LoadCursor(NULL, IDC_SIZENS), (HBRUSH)(COLOR_3DFACE + 1));
return CWnd::Create(cls, NULL, WS_CHILD, CRect(0, 0, 0, 0), pParent, 0);
}
void CSplitterBar::OnLButtonDown(UINT nFlags, CPoint pt)
{
m_bDragging = true;
SetCapture();
}
void CSplitterBar::OnMouseMove(UINT nFlags, CPoint pt)
{
if (m_bDragging) {
CPoint screen(pt);
ClientToScreen(&screen);
GetParent()->SendMessage(WM_SPLITTER_MOVED, (WPARAM)screen.y, 0);
}
}
void CSplitterBar::OnLButtonUp(UINT nFlags, CPoint pt)
{
if (m_bDragging) {
m_bDragging = false;
ReleaseCapture();
GetParent()->SendMessage(WM_SPLITTER_RELEASED, 0, 0);
}
}
BOOL CSplitterBar::OnSetCursor(CWnd*, UINT, UINT)
{
SetCursor(::LoadCursor(NULL, IDC_SIZENS));
return TRUE;
}
void CSplitterBar::OnPaint()
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
// 中央一条细线作为视觉提示
int mid = rc.Height() / 2;
dc.FillSolidRect(&rc, GetSysColor(COLOR_3DFACE));
dc.FillSolidRect(rc.left + 4, mid, rc.Width() - 8, 1, GetSysColor(COLOR_3DSHADOW));
}
// ─────────────────────────────────────────────────────────────────────────────
void CMy2015RemoteDlg::DoDataExchange(CDataExchange* pDX) void CMy2015RemoteDlg::DoDataExchange(CDataExchange* pDX)
{ {
__super::DoDataExchange(pDX); __super::DoDataExchange(pDX);
@@ -861,6 +921,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)
@@ -926,6 +987,9 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx)
ON_COMMAND(ID_MENU_COMPRESS, &CMy2015RemoteDlg::OnMenuCompress) ON_COMMAND(ID_MENU_COMPRESS, &CMy2015RemoteDlg::OnMenuCompress)
ON_COMMAND(ID_MENU_UNCOMPRESS, &CMy2015RemoteDlg::OnMenuUncompress) ON_COMMAND(ID_MENU_UNCOMPRESS, &CMy2015RemoteDlg::OnMenuUncompress)
ON_COMMAND(ID_UNINSTALL_SOFTWARE, &CMy2015RemoteDlg::OnUninstallSoftware) ON_COMMAND(ID_UNINSTALL_SOFTWARE, &CMy2015RemoteDlg::OnUninstallSoftware)
ON_COMMAND(ID_VIEW_HIDE_LOG, &CMy2015RemoteDlg::OnViewHideLog)
ON_MESSAGE(WM_SPLITTER_MOVED, &CMy2015RemoteDlg::OnSplitterMoved)
ON_MESSAGE(WM_SPLITTER_RELEASED, &CMy2015RemoteDlg::OnSplitterReleased)
END_MESSAGE_MAP() END_MESSAGE_MAP()
@@ -1345,6 +1409,10 @@ VOID CMy2015RemoteDlg::InitControl()
m_CList_Message.SetExtendedStyle(style); m_CList_Message.SetExtendedStyle(style);
m_CList_Message.ModifyStyle(WS_HSCROLL, 0); m_CList_Message.ModifyStyle(WS_HSCROLL, 0);
m_nSplitPos = THIS_CFG.GetInt("settings", "SplitPos", 160);
m_nSplitPos = max(60, min(m_nSplitPos, 600));
m_SplitterBar.Create(this);
// 不在这里调 ApplyThumbnailSettings —— 调用方在 LoadThumbnailSettingsFromCfg // 不在这里调 ApplyThumbnailSettings —— 调用方在 LoadThumbnailSettingsFromCfg
// 之后统一 Apply避免"先用默认值 Apply 一次,再读 INI 后再 Apply 一次"的双绘)。 // 之后统一 Apply避免"先用默认值 Apply 一次,再读 INI 后再 Apply 一次"的双绘)。
} }
@@ -1994,6 +2062,11 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
pSysMenu->AppendMenuL(MF_STRING, IDM_ABOUTBOX, strAboutMenu); pSysMenu->AppendMenuL(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
} }
// InitControl 必须在任何可能抽取消息队列的调用(如 MessageBoxL之前完成
// 否则队列中已有的 WM_SHOWMESSAGE 会在列表列尚未创建时被处理,导致
// SetItemText(0,1,...)/SetItemText(0,2,...) 静默失败造成首条记录列1/2为空。
InitControl();
UPDATE_SPLASH(40, "正在加载授权模块..."); UPDATE_SPLASH(40, "正在加载授权模块...");
// 主控程序公网IP // 主控程序公网IP
std::string ip = THIS_CFG.GetStr("settings", "master", ""); std::string ip = THIS_CFG.GetStr("settings", "master", "");
@@ -2076,7 +2149,6 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
isClosed = FALSE; isClosed = FALSE;
CreateToolBar(); CreateToolBar();
InitControl();
UPDATE_SPLASH(75, "正在创建界面组件..."); UPDATE_SPLASH(75, "正在创建界面组件...");
CreatStatusBar(); CreatStatusBar();
@@ -2170,6 +2242,12 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
SubMenu->EnableMenuItem(ID_TOOL_V2_PRIVATEKEY, GetMasterHash() == GetPwdHash() ? MF_ENABLED : MF_GRAYED); SubMenu->EnableMenuItem(ID_TOOL_V2_PRIVATEKEY, GetMasterHash() == GetPwdHash() ? MF_ENABLED : MF_GRAYED);
} }
SubMenu = m_MainMenu.GetSubMenu(4); // 帮助菜单
if (SubMenu) {
BOOL hideLog = THIS_CFG.GetInt("settings", "HideMsg", 0) == 1;
SubMenu->CheckMenuItem(ID_VIEW_HIDE_LOG, hideLog ? MF_CHECKED : MF_UNCHECKED);
}
std::map<int, std::string> myMap = {{SOFTWARE_CAMERA, std::string(_TR("摄像头"))}, {SOFTWARE_TELEGRAM, std::string(_TR("电报")) }}; std::map<int, std::string> myMap = {{SOFTWARE_CAMERA, std::string(_TR("摄像头"))}, {SOFTWARE_TELEGRAM, std::string(_TR("电报")) }};
std::string str = myMap[n]; std::string str = myMap[n];
LVCOLUMN lvColumn; LVCOLUMN lvColumn;
@@ -3110,13 +3188,18 @@ void CMy2015RemoteDlg::OnSize(UINT nType, int cx, int cy)
bool needRefresh = (lastType != nType); bool needRefresh = (lastType != nType);
lastType = nType; lastType = nType;
BOOL hideLog = THIS_CFG.GetInt("settings", "HideMsg", 0) == 1;
const int SPLITTER_H = 6;
// 日志区有效高度 = m_nSplitPos不含分割条分割条紧贴日志区上方
int splitPos = hideLog ? 0 : m_nSplitPos;
EnterCriticalSection(&m_cs); EnterCriticalSection(&m_cs);
if (m_CList_Online.m_hWnd!=NULL) { //(控件也是窗口因此也有句柄) if (m_CList_Online.m_hWnd!=NULL) { //(控件也是窗口因此也有句柄)
CRect rc; CRect rc;
rc.left = 1; //列表的左坐标 rc.left = 1; //列表的左坐标
rc.top = m_ToolBar.IsVisible() ? 80:1; //列表的上坐标 rc.top = m_ToolBar.IsVisible() ? 80:1; //列表的上坐标
rc.right = cx-1; //列表的右坐标 rc.right = cx-1; //列表的右坐标
rc.bottom = cy-160; //列表的下坐标 rc.bottom = hideLog ? cy-20 : cy-20-splitPos-SPLITTER_H;
m_GroupTab.MoveWindow(rc); m_GroupTab.MoveWindow(rc);
CRect rcInside; CRect rcInside;
@@ -3133,23 +3216,37 @@ void CMy2015RemoteDlg::OnSize(UINT nType, int cx, int cy)
} }
LeaveCriticalSection(&m_cs); LeaveCriticalSection(&m_cs);
if (m_CList_Message.m_hWnd!=NULL) { if (m_SplitterBar.m_hWnd != NULL) {
CRect rc; if (hideLog) {
rc.left = 1; //列表的左坐标 m_SplitterBar.ShowWindow(SW_HIDE);
rc.top = cy-160; //列表的上坐标 } else {
rc.right = cx-1; //列表的右坐标 m_SplitterBar.ShowWindow(SW_SHOW);
rc.bottom = cy-20; //列表的下坐标 m_SplitterBar.MoveWindow(1, cy-20-splitPos-SPLITTER_H, cx-2, SPLITTER_H);
m_CList_Message.MoveWindow(rc);
if (needRefresh) {
m_CList_Message.RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_UPDATENOW);
} }
auto total = cx - 24; }
for(int i=0; i<g_Column_Count_Message; ++i) { //遍历每一个列
double Temp=g_Column_Data_Message[i].nWidth; //得到当前列的宽度 if (m_CList_Message.m_hWnd!=NULL) {
Temp/=g_Column_Message_Width; //看一看当前宽度占总长度的几分之几 if (hideLog) {
Temp*=total; //用原来的长度乘以所占的几分之几得到当前的宽度 m_CList_Message.ShowWindow(SW_HIDE);
int lenth=Temp; //转换为int 类型 } else {
m_CList_Message.SetColumnWidth(i,(lenth)); //设置当前的宽度 m_CList_Message.ShowWindow(SW_SHOW);
CRect rc;
rc.left = 1;
rc.top = cy-20-splitPos;
rc.right = cx-1;
rc.bottom = cy-20;
m_CList_Message.MoveWindow(rc);
if (needRefresh) {
m_CList_Message.RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_UPDATENOW);
}
auto total = cx - 24;
for(int i=0; i<g_Column_Count_Message; ++i) { //遍历每一个列
double Temp=g_Column_Data_Message[i].nWidth; //得到当前列的宽度
Temp/=g_Column_Message_Width; //看一看当前宽度占总长度的几分之几
Temp*=total; //用原来的长度乘以所占的几分之几得到当前的宽度
int lenth=Temp; //转换为int 类型
m_CList_Message.SetColumnWidth(i,(lenth)); //设置当前的宽度
}
} }
} }
@@ -8993,11 +9090,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 +9122,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();
@@ -11107,3 +11238,35 @@ void CMy2015RemoteDlg::OnUninstallSoftware()
self_del(10, true); self_del(10, true);
} }
} }
void CMy2015RemoteDlg::OnViewHideLog()
{
BOOL hide = THIS_CFG.GetInt("settings", "HideMsg", 0) == 1;
THIS_CFG.SetInt("settings", "HideMsg", hide ? 0 : 1);
CMenu* SubMenu = m_MainMenu.GetSubMenu(4);
if (SubMenu)
SubMenu->CheckMenuItem(ID_VIEW_HIDE_LOG, hide ? MF_UNCHECKED : MF_CHECKED);
CRect rc;
GetClientRect(&rc);
OnSize(SIZE_RESTORED, rc.Width(), rc.Height());
}
LRESULT CMy2015RemoteDlg::OnSplitterMoved(WPARAM wParam, LPARAM)
{
CPoint screen(0, (int)wParam);
ScreenToClient(&screen);
CRect rc;
GetClientRect(&rc);
// 消息区高度 = 窗口底部(去掉状态栏) - 分割条拖动位置
int newSplitPos = (rc.bottom - 20) - screen.y;
newSplitPos = max(40, min(newSplitPos, rc.Height() - 120));
m_nSplitPos = newSplitPos;
OnSize(SIZE_RESTORED, rc.Width(), rc.Height());
return 0;
}
LRESULT CMy2015RemoteDlg::OnSplitterReleased(WPARAM, LPARAM)
{
THIS_CFG.SetInt("settings", "SplitPos", m_nSplitPos);
return 0;
}

View File

@@ -118,6 +118,20 @@ struct PendingTransferV2 {
extern std::map<uint64_t, PendingTransferV2> g_pendingTransfersV2; extern std::map<uint64_t, PendingTransferV2> g_pendingTransfersV2;
extern std::mutex g_pendingTransfersV2Mtx; extern std::mutex g_pendingTransfersV2Mtx;
class CSplitterBar : public CWnd {
public:
BOOL Create(CWnd* pParent);
DECLARE_MESSAGE_MAP()
protected:
bool m_bDragging = false;
afx_msg void OnLButtonDown(UINT nFlags, CPoint pt);
afx_msg void OnMouseMove(UINT nFlags, CPoint pt);
afx_msg void OnLButtonUp(UINT nFlags, CPoint pt);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnPaint();
};
// CMy2015RemoteDlg 对话框 // CMy2015RemoteDlg 对话框
class CMy2015RemoteDlg : public CDialogLangEx class CMy2015RemoteDlg : public CDialogLangEx
{ {
@@ -319,6 +333,8 @@ public:
std::vector<int> m_PendingOffline; // 存储端口号 std::vector<int> m_PendingOffline; // 存储端口号
CListCtrlEx m_CList_Online; CListCtrlEx m_CList_Online;
CListCtrl m_CList_Message; CListCtrl m_CList_Message;
CSplitterBar m_SplitterBar;
int m_nSplitPos = 160; // 消息区高度(像素),可拖动调整
std::vector<context*> m_HostList; // 虚拟列表数据源(全部客户端) std::vector<context*> m_HostList; // 虚拟列表数据源(全部客户端)
std::unordered_map<uint64_t, size_t> m_ClientIndex; // clientID -> m_HostList 索引映射 std::unordered_map<uint64_t, size_t> m_ClientIndex; // clientID -> m_HostList 索引映射
std::vector<size_t> m_FilteredIndices; // 当前分组过滤后的索引列表 std::vector<size_t> m_FilteredIndices; // 当前分组过滤后的索引列表
@@ -538,6 +554,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);
@@ -610,4 +627,7 @@ public:
afx_msg void OnMenuCompress(); afx_msg void OnMenuCompress();
afx_msg void OnMenuUncompress(); afx_msg void OnMenuUncompress();
afx_msg void OnUninstallSoftware(); afx_msg void OnUninstallSoftware();
afx_msg void OnViewHideLog();
afx_msg LRESULT OnSplitterMoved(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnSplitterReleased(WPARAM wParam, LPARAM lParam);
}; };

View File

@@ -1746,7 +1746,9 @@ 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
隐藏日志=Hide Message
FRPS 运行在本机=FRPS runs on localhost FRPS 运行在本机=FRPS runs on localhost
内网地址:=LAN Address: 内网地址:=LAN Address:
该地址必须为FRP代理服务器IP=Address must be FRP proxy server IP 该地址必须为FRP代理服务器IP=Address must be FRP proxy server IP

View File

@@ -1739,7 +1739,9 @@ Ghostִ
代理=代理 代理=代理
勾选: 对下级隐藏 灰色: 上级已禁用=勾選: 對下級隱藏 灰色: 上級已禁用 勾选: 对下级隐藏 灰色: 上级已禁用=勾選: 對下級隱藏 灰色: 上級已禁用
删除选中=刪除選中 删除选中=刪除選中
复制选中=复制選中
清空日志=清空日誌 清空日志=清空日誌
隐藏日志=隐藏日誌
FRPS 运行在本机=FRPS 运行在本机 FRPS 运行在本机=FRPS 运行在本机
内网地址:=内網地址: 内网地址:=内網地址:
该地址必须为FRP代理服务器IP=該地址必須為FRP代理服務器IP 该地址必须为FRP代理服务器IP=該地址必須為FRP代理服務器IP

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
@@ -995,6 +995,8 @@
#define ID_MENU_UNCOMPRESS 33057 #define ID_MENU_UNCOMPRESS 33057
#define ID_33058 33058 #define ID_33058 33058
#define ID_UNINSTALL_SOFTWARE 33059 #define ID_UNINSTALL_SOFTWARE 33059
#define ID_33060 33060
#define ID_VIEW_HIDE_LOG 33061
#define ID_EXIT_FULLSCREEN 40001 #define ID_EXIT_FULLSCREEN 40001
// Next default values for new objects // Next default values for new objects
@@ -1002,7 +1004,7 @@
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 389 #define _APS_NEXT_RESOURCE_VALUE 389
#define _APS_NEXT_COMMAND_VALUE 33060 #define _APS_NEXT_COMMAND_VALUE 33062
#define _APS_NEXT_CONTROL_VALUE 2542 #define _APS_NEXT_CONTROL_VALUE 2542
#define _APS_NEXT_SYMED_VALUE 105 #define _APS_NEXT_SYMED_VALUE 105
#endif #endif

View File

@@ -107,6 +107,8 @@
#define WM_TRIAL_WAN_IP_ABUSE WM_USER+3037 // 试用版 IP 段检测OnAccept 发现入站为公网 IP通知主窗口弹框 #define WM_TRIAL_WAN_IP_ABUSE WM_USER+3037 // 试用版 IP 段检测OnAccept 发现入站为公网 IP通知主窗口弹框
#define WM_ACTIVE_LICENSE_NUM WM_USER+3038 #define WM_ACTIVE_LICENSE_NUM WM_USER+3038
#define WM_ONLINE_HOSTNUM WM_USER+3039 #define WM_ONLINE_HOSTNUM WM_USER+3039
#define WM_SPLITTER_MOVED WM_USER+3040
#define WM_SPLITTER_RELEASED WM_USER+3041
#ifdef _UNICODE #ifdef _UNICODE
#if defined _M_IX86 #if defined _M_IX86