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