diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc
index 5e8751e..2d366a6 100644
Binary files a/server/2015Remote/2015Remote.rc and b/server/2015Remote/2015Remote.rc differ
diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj
index a67b4b1..602eb7b 100644
--- a/server/2015Remote/2015Remote_vs2015.vcxproj
+++ b/server/2015Remote/2015Remote_vs2015.vcxproj
@@ -319,6 +319,7 @@
+
@@ -406,6 +407,7 @@
+
diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters
index d200b67..0329b67 100644
--- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters
+++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters
@@ -60,6 +60,7 @@
+
@@ -133,6 +134,7 @@
+
diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.user b/server/2015Remote/2015Remote_vs2015.vcxproj.user
index 2f18391..3e6c92a 100644
--- a/server/2015Remote/2015Remote_vs2015.vcxproj.user
+++ b/server/2015Remote/2015Remote_vs2015.vcxproj.user
@@ -22,5 +22,6 @@
2015Remote.rc
+ false
\ No newline at end of file
diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp
index b36e35e..5ef360c 100644
--- a/server/2015Remote/ScreenSpyDlg.cpp
+++ b/server/2015Remote/ScreenSpyDlg.cpp
@@ -139,6 +139,8 @@ CScreenSpyDlg::~CScreenSpyDlg()
m_pCodec = 0;
// AVFrame需要清除
av_frame_unref(&m_AVFrame);
+
+ SAFE_DELETE(m_pToolbar);
}
void CScreenSpyDlg::DoDataExchange(CDataExchange* pDX)
@@ -163,6 +165,7 @@ BEGIN_MESSAGE_MAP(CScreenSpyDlg, CDialog)
ON_WM_LBUTTONDBLCLK()
ON_WM_ACTIVATE()
ON_WM_TIMER()
+ ON_COMMAND(ID_EXIT_FULLSCREEN, &CScreenSpyDlg::OnExitFullscreen)
END_MESSAGE_MAP()
@@ -692,6 +695,9 @@ void CScreenSpyDlg::OnTimer(UINT_PTR nIDEvent)
SetTextColor(m_hFullDC, RGB(0xff, 0x00, 0x00));
TextOut(m_hFullDC, 0, 0, lpTipsString, lstrlen(lpTipsString));
}
+ if (nIDEvent == 1 && m_bFullScreen && m_pToolbar) {
+ m_pToolbar->CheckMousePosition();
+ }
CDialog::OnTimer(nIDEvent);
}
@@ -717,8 +723,15 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg)
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
- if (pMsg->wParam == VK_F11 && LeaveFullScreen()) // F11: 退出全屏
- return TRUE;
+ if (pMsg->message == WM_KEYDOWN && m_bFullScreen) {
+ // Ctrl+Alt+Home 退出全屏(备用)
+ if (pMsg->wParam == VK_HOME &&
+ (GetKeyState(VK_CONTROL) & 0x8000) &&
+ (GetKeyState(VK_MENU) & 0x8000)) {
+ LeaveFullScreen();
+ return TRUE;
+ }
+ }
if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN) {
SendScaledMouseMessage(pMsg, true);
}
@@ -957,8 +970,18 @@ void CScreenSpyDlg::EnterFullScreen()
SetWindowPos(&CWnd::wndTop, rcMonitor.left, rcMonitor.top, rcMonitor.right - rcMonitor.left,
rcMonitor.bottom - rcMonitor.top, SWP_NOZORDER | SWP_FRAMECHANGED);
+ if (!m_pToolbar) {
+ m_pToolbar = new CToolbarDlg(this);
+ m_pToolbar->Create(IDD_TOOLBAR_DLG, this);
+ int cx = GetSystemMetrics(SM_CXSCREEN);
+ int cy = GetSystemMetrics(SM_CYSCREEN);
+ m_pToolbar->SetWindowPos(&wndTopMost, 0, -40, cx, 40, SWP_HIDEWINDOW);
+ }
+
// 7. 标记全屏模式
m_bFullScreen = true;
+
+ SetTimer(1, 200, NULL);
}
}
@@ -966,6 +989,13 @@ void CScreenSpyDlg::EnterFullScreen()
bool CScreenSpyDlg::LeaveFullScreen()
{
if (m_bFullScreen) {
+ KillTimer(1);
+ if (m_pToolbar) {
+ m_pToolbar->DestroyWindow();
+ delete m_pToolbar;
+ m_pToolbar = nullptr;
+ }
+
// 1. 恢复窗口样式
LONG lStyle = GetWindowLong(m_hWnd, GWL_STYLE);
lStyle |= (WS_CAPTION | WS_THICKFRAME | WS_BORDER);
diff --git a/server/2015Remote/ScreenSpyDlg.h b/server/2015Remote/ScreenSpyDlg.h
index ba489f0..ffa3f0c 100644
--- a/server/2015Remote/ScreenSpyDlg.h
+++ b/server/2015Remote/ScreenSpyDlg.h
@@ -2,6 +2,7 @@
#include "IOCPServer.h"
#include "..\..\client\CursorInfo.h"
#include "VideoDlg.h"
+#include "ToolbarDlg.h"
extern "C"
{
@@ -42,6 +43,7 @@ extern "C"
class CScreenSpyDlg : public DialogBase
{
DECLARE_DYNAMIC(CScreenSpyDlg)
+ CToolbarDlg* m_pToolbar = nullptr;
public:
CScreenSpyDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL);
@@ -120,6 +122,9 @@ public:
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
+ afx_msg void OnExitFullscreen() {
+ LeaveFullScreen();
+ }
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧
diff --git a/server/2015Remote/ToolbarDlg.cpp b/server/2015Remote/ToolbarDlg.cpp
new file mode 100644
index 0000000..77e6af7
--- /dev/null
+++ b/server/2015Remote/ToolbarDlg.cpp
@@ -0,0 +1,108 @@
+#include "stdafx.h"
+#include "ToolbarDlg.h"
+#include "2015RemoteDlg.h"
+
+IMPLEMENT_DYNAMIC(CToolbarDlg, CDialogEx)
+
+CToolbarDlg::CToolbarDlg(CWnd* pParent)
+ : CDialogEx(IDD_TOOLBAR_DLG, pParent)
+{
+}
+
+CToolbarDlg::~CToolbarDlg()
+{
+}
+
+void CToolbarDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialogEx::DoDataExchange(pDX);
+}
+
+BEGIN_MESSAGE_MAP(CToolbarDlg, CDialogEx)
+ ON_BN_CLICKED(IDC_BTN_EXIT_FULLSCREEN, &CToolbarDlg::OnBnClickedExitFullscreen)
+ ON_BN_CLICKED(IDC_BTN_MINIMIZE, &CToolbarDlg::OnBnClickedMinimize)
+ ON_BN_CLICKED(IDC_BTN_CLOSE, &CToolbarDlg::OnBnClickedClose)
+END_MESSAGE_MAP()
+
+void CToolbarDlg::CheckMousePosition()
+{
+ CPoint pt;
+ GetCursorPos(&pt);
+
+ if (pt.y <= 2) {
+ if (!m_bVisible) SlideIn();
+ }
+ else if (pt.y > m_nHeight + 20) {
+ if (m_bVisible) SlideOut();
+ }
+}
+
+void CToolbarDlg::SlideIn()
+{
+ m_bVisible = true;
+ ShowWindow(SW_SHOWNOACTIVATE);
+
+ int cx = GetSystemMetrics(SM_CXSCREEN);
+ for (int y = -m_nHeight; y <= 0; y += 8) {
+ SetWindowPos(&wndTopMost, 0, y, cx, m_nHeight, SWP_NOACTIVATE);
+ Sleep(10);
+ }
+ SetWindowPos(&wndTopMost, 0, 0, cx, m_nHeight, SWP_NOACTIVATE);
+}
+
+void CToolbarDlg::SlideOut()
+{
+ int cx = GetSystemMetrics(SM_CXSCREEN);
+ for (int y = 0; y >= -m_nHeight; y -= 8) {
+ SetWindowPos(&wndTopMost, 0, y, cx, m_nHeight, SWP_NOACTIVATE);
+ Sleep(10);
+ }
+ ShowWindow(SW_HIDE);
+ m_bVisible = false;
+}
+
+void CToolbarDlg::OnBnClickedExitFullscreen()
+{
+ // 通知父窗口退出全屏
+ GetParent()->PostMessage(WM_COMMAND, ID_EXIT_FULLSCREEN, 0);
+}
+
+void CToolbarDlg::OnBnClickedMinimize()
+{
+ GetParent()->ShowWindow(SW_MINIMIZE);
+ SlideOut();
+}
+
+void CToolbarDlg::OnBnClickedClose()
+{
+ GetParent()->PostMessage(WM_CLOSE);
+}
+
+BOOL CToolbarDlg::OnInitDialog()
+{
+ CDialogEx::OnInitDialog();
+
+ // 设置分层窗口样式
+ ModifyStyleEx(0, WS_EX_LAYERED);
+
+ // 设置透明度 (0-255)
+ SetLayeredWindowAttributes(0, 100, LWA_ALPHA);
+
+ // 按钮居中代码...
+ int cx = GetSystemMetrics(SM_CXSCREEN);
+ int btnWidth = 80;
+ int btnHeight = 28;
+ int btnSpacing = 10;
+ int totalWidth = btnWidth * 3 + btnSpacing * 2;
+ int startX = (cx - totalWidth) / 2;
+ int y = (m_nHeight - btnHeight) / 2;
+
+ GetDlgItem(IDC_BTN_EXIT_FULLSCREEN)->SetWindowPos(NULL,
+ startX, y, btnWidth, btnHeight, SWP_NOZORDER);
+ GetDlgItem(IDC_BTN_MINIMIZE)->SetWindowPos(NULL,
+ startX + btnWidth + btnSpacing, y, btnWidth, btnHeight, SWP_NOZORDER);
+ GetDlgItem(IDC_BTN_CLOSE)->SetWindowPos(NULL,
+ startX + (btnWidth + btnSpacing) * 2, y, btnWidth, btnHeight, SWP_NOZORDER);
+
+ return TRUE;
+}
diff --git a/server/2015Remote/ToolbarDlg.h b/server/2015Remote/ToolbarDlg.h
new file mode 100644
index 0000000..c6ea950
--- /dev/null
+++ b/server/2015Remote/ToolbarDlg.h
@@ -0,0 +1,30 @@
+#pragma once
+#include "Resource.h"
+
+class CToolbarDlg : public CDialogEx
+{
+ DECLARE_DYNAMIC(CToolbarDlg)
+
+public:
+ CToolbarDlg(CWnd* pParent = nullptr);
+ virtual ~CToolbarDlg();
+
+ enum { IDD = IDD_TOOLBAR_DLG };
+
+ int m_nHeight = 40;
+ bool m_bVisible = false;
+
+ void SlideIn();
+ void SlideOut();
+ void CheckMousePosition();
+
+protected:
+ virtual void DoDataExchange(CDataExchange* pDX);
+ DECLARE_MESSAGE_MAP()
+
+public:
+ afx_msg void OnBnClickedExitFullscreen();
+ afx_msg void OnBnClickedMinimize();
+ afx_msg void OnBnClickedClose();
+ virtual BOOL OnInitDialog();
+};
diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h
index 820a15c..b7da1fc 100644
Binary files a/server/2015Remote/resource.h and b/server/2015Remote/resource.h differ