远程桌面优化迟钝问题
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@@ -60,3 +60,9 @@ $RECYCLE.BIN/
|
|||||||
|
|
||||||
# Windows shortcuts
|
# Windows shortcuts
|
||||||
*.lnk
|
*.lnk
|
||||||
|
*.sdf
|
||||||
|
server/2015Remote/2015Remote.aps
|
||||||
|
*.ipch
|
||||||
|
*.aps
|
||||||
|
*.suo
|
||||||
|
server/2015Remote.VC.db
|
||||||
|
|||||||
@@ -24,3 +24,9 @@
|
|||||||
3、新增项目"ghost",不通过TestRun调用dll,而是直接生成可执行文件。
|
3、新增项目"ghost",不通过TestRun调用dll,而是直接生成可执行文件。
|
||||||
|
|
||||||
4、修复开启视频,客户端产生的一处内存泄漏缺陷,m_pCapture需要释放。
|
4、修复开启视频,客户端产生的一处内存泄漏缺陷,m_pCapture需要释放。
|
||||||
|
|
||||||
|
2019.1.7
|
||||||
|
|
||||||
|
1、ghost单台电脑只允许启动唯一的实例。
|
||||||
|
|
||||||
|
2、远程桌面反应迟钝,改用每秒传送8帧屏幕,后续有待优化。
|
||||||
|
|||||||
@@ -39,6 +39,12 @@ int main(int argc, const char *argv[])
|
|||||||
std::cout<<"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n";
|
std::cout<<"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n";
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
HANDLE hMutex = ::CreateMutexA(NULL, TRUE, "ghost.exe");
|
||||||
|
if (ERROR_ALREADY_EXISTS == GetLastError())
|
||||||
|
{
|
||||||
|
CloseHandle(hMutex);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
SetConsoleCtrlHandler(&callback, TRUE);
|
SetConsoleCtrlHandler(&callback, TRUE);
|
||||||
const char *szServerIP = argv[1];
|
const char *szServerIP = argv[1];
|
||||||
@@ -54,6 +60,7 @@ int main(int argc, const char *argv[])
|
|||||||
CloseHandle(hThread);
|
CloseHandle(hThread);
|
||||||
status = E_STOP;
|
status = E_STOP;
|
||||||
|
|
||||||
|
CloseHandle(hMutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int IOCPClient::OnServerSending(char* szBuffer, ULONG ulOriginalLength) //Hello
|
int IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) //Hello
|
||||||
{
|
{
|
||||||
m_WriteBuffer.ClearBuffer();
|
m_WriteBuffer.ClearBuffer();
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
static DWORD WINAPI WorkThreadProc(LPVOID lParam);
|
static DWORD WINAPI WorkThreadProc(LPVOID lParam);
|
||||||
|
|
||||||
VOID OnServerReceiving(char* szBuffer, ULONG ulReceivedLength);
|
VOID OnServerReceiving(char* szBuffer, ULONG ulReceivedLength);
|
||||||
int OnServerSending(char* szBuffer, ULONG ulOriginalLength);
|
int OnServerSending(const char* szBuffer, ULONG ulOriginalLength);
|
||||||
BOOL SendWithSplit(char* szBuffer, ULONG ulLength, ULONG ulSplitLength);
|
BOOL SendWithSplit(char* szBuffer, ULONG ulLength, ULONG ulSplitLength);
|
||||||
|
|
||||||
BOOL IsRunning() const
|
BOOL IsRunning() const
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#else
|
#else
|
||||||
#include <WinUser.h>
|
#include <WinUser.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <time.h>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
@@ -44,10 +45,25 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam)
|
|||||||
|
|
||||||
This->WaitForDialogOpen();
|
This->WaitForDialogOpen();
|
||||||
|
|
||||||
|
clock_t last = clock();
|
||||||
This->SendFirstScreen();
|
This->SendFirstScreen();
|
||||||
|
const int fps = 8;// ֡<><D6A1>
|
||||||
|
const int sleep = 1000 / fps;// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>䣨ms<6D><73>
|
||||||
while (This->m_bIsWorking)
|
while (This->m_bIsWorking)
|
||||||
{
|
{
|
||||||
This->SendNextScreen();
|
ULONG ulNextSendLength = 0;
|
||||||
|
const char* szBuffer = This->GetNextScreen(ulNextSendLength);
|
||||||
|
if (szBuffer)
|
||||||
|
{
|
||||||
|
int span = sleep-(clock() - last);
|
||||||
|
Sleep(span > 0 ? span : 1);
|
||||||
|
if (span < 0)
|
||||||
|
printf("SendScreen Span = %d ms\n", span);
|
||||||
|
last = clock();
|
||||||
|
This->SendNextScreen(szBuffer, ulNextSendLength);
|
||||||
|
delete[] szBuffer;
|
||||||
|
szBuffer = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cout<<"ScreenWorkThread Exit"<<endl;
|
cout<<"ScreenWorkThread Exit"<<endl;
|
||||||
@@ -196,35 +212,30 @@ VOID CScreenManager::SendFirstScreen()
|
|||||||
szBuffer = NULL;
|
szBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* CScreenManager::GetNextScreen(ULONG &ulNextSendLength)
|
||||||
VOID CScreenManager::SendNextScreen()
|
|
||||||
{
|
{
|
||||||
//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݴ<EFBFBD>С<EFBFBD><D0A1>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݴ<EFBFBD>С<EFBFBD><D0A1>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
//<2F><><EFBFBD>ǵ<EFBFBD>getNextScreen<65><6E><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
|
//<2F><><EFBFBD>ǵ<EFBFBD>getNextScreen<65><6E><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
|
||||||
LPVOID NextScreenData = NULL;
|
LPVOID NextScreenData = m_ScreenSpyObject->GetNextScreenData(&ulNextSendLength);
|
||||||
ULONG ulNextSendLength = 0;
|
|
||||||
NextScreenData = m_ScreenSpyObject->GetNextScreenData(&ulNextSendLength);
|
|
||||||
|
|
||||||
if (ulNextSendLength == 0 || NextScreenData==NULL)
|
if (ulNextSendLength == 0 || NextScreenData == NULL)
|
||||||
{
|
{
|
||||||
return;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulNextSendLength += 1;
|
ulNextSendLength += 1;
|
||||||
|
|
||||||
LPBYTE szBuffer = new BYTE[ulNextSendLength];
|
char* szBuffer = new char[ulNextSendLength];
|
||||||
if (szBuffer == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
szBuffer[0] = TOKEN_NEXTSCREEN;
|
szBuffer[0] = TOKEN_NEXTSCREEN;
|
||||||
memcpy(szBuffer + 1, NextScreenData, ulNextSendLength - 1);
|
memcpy(szBuffer + 1, NextScreenData, ulNextSendLength - 1);
|
||||||
|
|
||||||
m_ClientObject->OnServerSending((char*)szBuffer, ulNextSendLength);
|
return szBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
delete [] szBuffer;
|
VOID CScreenManager::SendNextScreen(const char* szBuffer, ULONG ulNextSendLength)
|
||||||
szBuffer = NULL;
|
{
|
||||||
|
m_ClientObject->OnServerSending(szBuffer, ulNextSendLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength)
|
VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength)
|
||||||
|
|||||||
@@ -22,18 +22,19 @@ public:
|
|||||||
HANDLE m_hWorkThread;
|
HANDLE m_hWorkThread;
|
||||||
|
|
||||||
static DWORD WINAPI WorkThreadProc(LPVOID lParam);
|
static DWORD WINAPI WorkThreadProc(LPVOID lParam);
|
||||||
VOID CScreenManager::SendBitMapInfor();
|
VOID SendBitMapInfor();
|
||||||
VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength);
|
VOID OnReceive(PBYTE szBuffer, ULONG ulLength);
|
||||||
|
|
||||||
CScreenSpy* m_ScreenSpyObject;
|
CScreenSpy* m_ScreenSpyObject;
|
||||||
VOID CScreenManager::SendFirstScreen();
|
VOID SendFirstScreen();
|
||||||
VOID CScreenManager::SendNextScreen();
|
const char* GetNextScreen(ULONG &ulNextSendLength);
|
||||||
|
VOID SendNextScreen(const char* szBuffer, ULONG ulNextSendLength);
|
||||||
|
|
||||||
VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength);
|
VOID ProcessCommand(LPBYTE szBuffer, ULONG ulLength);
|
||||||
BOOL m_bIsWorking;
|
BOOL m_bIsWorking;
|
||||||
BOOL m_bIsBlockInput;
|
BOOL m_bIsBlockInput;
|
||||||
VOID CScreenManager::SendClientClipboard();
|
VOID SendClientClipboard();
|
||||||
VOID CScreenManager::UpdateClientClipboard(char *szBuffer, ULONG ulLength);
|
VOID UpdateClientClipboard(char *szBuffer, ULONG ulLength);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !defined(AFX_SCREENMANAGER_H__511DF666_6E18_4408_8BD5_8AB8CD1AEF8F__INCLUDED_)
|
#endif // !defined(AFX_SCREENMANAGER_H__511DF666_6E18_4408_8BD5_8AB8CD1AEF8F__INCLUDED_)
|
||||||
|
|||||||
@@ -200,10 +200,14 @@ VOID CScreenSpy::WriteRectBuffer(LPBYTE szBuffer,ULONG ulLength)
|
|||||||
m_RectBufferOffset += ulLength;
|
m_RectBufferOffset += ulLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHeight)
|
VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHeight)
|
||||||
{
|
{
|
||||||
ULONG ulJumpLine = 50;
|
#ifdef COPY_ALL
|
||||||
ULONG ulJumpSleep = ulJumpLine / 10;
|
BitBlt(hdcDest, 0, 0, ulWidth, ulHeight, hdcSour, 0, 0, m_dwBitBltRop);
|
||||||
|
#else
|
||||||
|
const ULONG ulJumpLine = 50;
|
||||||
|
const ULONG ulJumpSleep = ulJumpLine / 10;
|
||||||
|
|
||||||
for (int i = 0, ulToJump = 0; i < ulHeight; i += ulToJump)
|
for (int i = 0, ulToJump = 0; i < ulHeight; i += ulToJump)
|
||||||
{
|
{
|
||||||
@@ -216,6 +220,7 @@ VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHei
|
|||||||
BitBlt(hdcDest, 0, i, ulWidth, ulToJump, hdcSour,0, i, m_dwBitBltRop);
|
BitBlt(hdcDest, 0, i, ulWidth, ulToJump, hdcSour,0, i, m_dwBitBltRop);
|
||||||
Sleep(ulJumpSleep);
|
Sleep(ulJumpSleep);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG CScreenSpy::CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData,
|
ULONG CScreenSpy::CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#endif // _MSC_VER > 1000
|
#endif // _MSC_VER > 1000
|
||||||
#define ALGORITHM_DIFF 1
|
#define ALGORITHM_DIFF 1
|
||||||
|
#define COPY_ALL 1 // <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>ֿ鿽<D6BF><E9BFBD><EFBFBD><EFBFBD>added by yuanyuanxiang 2019-1-7<><37>
|
||||||
#include "CursorInfor.h"
|
#include "CursorInfor.h"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,5 +6,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
|
<LocalDebuggerCommandArguments>192.168.43.165 2356</LocalDebuggerCommandArguments>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
Reference in New Issue
Block a user