From c24cc29093c5aed28643a983625fe998b848fc53 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Mon, 22 Dec 2025 23:01:19 +0100 Subject: [PATCH] Improve: Remove F11 to leave full screen (Use popup dialog) --- server/2015Remote/2015Remote.rc | Bin 107596 -> 108448 bytes server/2015Remote/2015Remote_vs2015.vcxproj | 2 + .../2015Remote_vs2015.vcxproj.filters | 2 + .../2015Remote/2015Remote_vs2015.vcxproj.user | 1 + server/2015Remote/ScreenSpyDlg.cpp | 34 +++++- server/2015Remote/ScreenSpyDlg.h | 5 + server/2015Remote/ToolbarDlg.cpp | 108 ++++++++++++++++++ server/2015Remote/ToolbarDlg.h | 30 +++++ server/2015Remote/resource.h | Bin 57238 -> 57682 bytes 9 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 server/2015Remote/ToolbarDlg.cpp create mode 100644 server/2015Remote/ToolbarDlg.h diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 5e8751eb66d426b0feb11e88f092eae2c35e6cc0..2d366a6dc9b89d03bc147a935da6be5df316a0b0 100644 GIT binary patch delta 278 zcmX?ef^EThwhaomCpS#w682~CXYgTgVsK;#Vu)vO0kYjEUp%VJX~bZ_pu?cRU^Mw) zbn0ZeAfd_ACM8Usa9xRmVZyJ#j6naG$p$w>G+h}Y7(5w5fLh%cLV=on7=js`fkwFk zp&!ryLk4rOLB^A7YpvNB()nY=f{ Wx(<+E1u<1^>}Cwzp3uwqMhpN;F-Qae delta 41 vcmZ2*p6$#DwhaomryrpH-K+fybo+K2%Fk}?si 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 820a15c9cc0f9a7da09297c1c25b89801649f3b9..b7da1fc6d366a774ce107624a4eca4198747185e 100644 GIT binary patch delta 269 zcmbQXpZU@u<_*7`Cx^IrO}?PW!W+Wi4}?ApP7IC=L6bMG)1JJ+k!5nsJ+a9KoE)1M zxg3a?T%gV-9>U49nzznJkk%=1PIoG6U64 zz8z;gS>Qg~u$>_oXhsmwRjxquIHAyl!2k>m85B0_-qmGf eG@7hvD?a(cJ&DO(_j)F~925hxMJ7Ak4+8+HyHLUa delta 84 zcmV-a0IUDf!ULAS1F-r-lOnq;ldwSqlPW|SlaNCall((SlkgA(v!X=6Sd%cH5R=3b qDw80m29t1~1hW>Oj6bvP-Y5Z+f