mirror of
https://github.com/yuanyuanxiang/SimpleRemoter.git
synced 2026-01-23 15:53:10 +08:00
Fix: Mouse double click can't select the wanted text
This commit is contained in:
@@ -150,6 +150,13 @@ public:
|
|||||||
int m_nScreenCount; // 屏幕数量
|
int m_nScreenCount; // 屏幕数量
|
||||||
BOOL m_bEnableMultiScreen;// 多显示器支持
|
BOOL m_bEnableMultiScreen;// 多显示器支持
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int m_nVScreenLeft = GetSystemMetrics(SM_XVIRTUALSCREEN);
|
||||||
|
int m_nVScreenTop = GetSystemMetrics(SM_YVIRTUALSCREEN);
|
||||||
|
int m_nVScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
|
||||||
|
int m_nVScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
|
||||||
|
|
||||||
|
public:
|
||||||
ScreenCapture(int n = 32, BYTE algo = ALGORITHM_DIFF, BOOL all = FALSE) :
|
ScreenCapture(int n = 32, BYTE algo = ALGORITHM_DIFF, BOOL all = FALSE) :
|
||||||
m_ThreadPool(nullptr), m_FirstBuffer(nullptr), m_RectBuffer(nullptr),
|
m_ThreadPool(nullptr), m_FirstBuffer(nullptr), m_RectBuffer(nullptr),
|
||||||
m_BitmapInfor_Full(nullptr), m_bAlgorithm(algo), m_SendQuality(100),
|
m_BitmapInfor_Full(nullptr), m_bAlgorithm(algo), m_SendQuality(100),
|
||||||
@@ -162,7 +169,7 @@ public:
|
|||||||
m_BmpZoomFirst = nullptr;
|
m_BmpZoomFirst = nullptr;
|
||||||
m_BlockNum = 8;
|
m_BlockNum = 8;
|
||||||
m_ThreadPool = new ThreadPool(m_BlockNum);
|
m_ThreadPool = new ThreadPool(m_BlockNum);
|
||||||
static auto monitors = GetAllMonitors();
|
auto monitors = GetAllMonitors();
|
||||||
static int index = 0;
|
static int index = 0;
|
||||||
m_nScreenCount = monitors.size();
|
m_nScreenCount = monitors.size();
|
||||||
m_bEnableMultiScreen = all;
|
m_bEnableMultiScreen = all;
|
||||||
@@ -235,6 +242,36 @@ public:
|
|||||||
return m_nScreenCount;
|
return m_nScreenCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual int GetScreenWidth() const
|
||||||
|
{
|
||||||
|
return m_ulFullWidth;
|
||||||
|
}
|
||||||
|
virtual int GetScreenHeight() const
|
||||||
|
{
|
||||||
|
return m_ulFullHeight;
|
||||||
|
}
|
||||||
|
virtual int GetScreenLeft() const {
|
||||||
|
return m_iScreenX;
|
||||||
|
}
|
||||||
|
virtual int GetScreenTop() const {
|
||||||
|
return m_iScreenY;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int GetVScreenWidth() const
|
||||||
|
{
|
||||||
|
return m_nVScreenWidth;
|
||||||
|
}
|
||||||
|
inline int GetVScreenHeight() const
|
||||||
|
{
|
||||||
|
return m_nVScreenHeight;
|
||||||
|
}
|
||||||
|
inline int GetVScreenLeft() const {
|
||||||
|
return m_nVScreenLeft;
|
||||||
|
}
|
||||||
|
inline int GetVScreenTop() const {
|
||||||
|
return m_nVScreenTop;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool IsOriginalSize() const
|
virtual bool IsOriginalSize() const
|
||||||
{
|
{
|
||||||
return m_BitmapInfor_Full->bmiHeader.biWidth == m_BitmapInfor_Send->bmiHeader.biWidth &&
|
return m_BitmapInfor_Full->bmiHeader.biWidth == m_BitmapInfor_Send->bmiHeader.biWidth &&
|
||||||
|
|||||||
@@ -588,6 +588,7 @@ VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case COMMAND_SCREEN_CONTROL: {
|
case COMMAND_SCREEN_CONTROL: {
|
||||||
|
if (m_ScreenSpyObject == NULL) break;
|
||||||
BlockInput(false);
|
BlockInput(false);
|
||||||
ProcessCommand(szBuffer + 1, ulLength - 1);
|
ProcessCommand(szBuffer + 1, ulLength - 1);
|
||||||
BlockInput(m_bIsBlockInput); //再恢复成用户的设置
|
BlockInput(m_bIsBlockInput); //再恢复成用户的设置
|
||||||
@@ -792,6 +793,19 @@ std::string GetTitle(HWND hWnd)
|
|||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 辅助判断是否为扩展键
|
||||||
|
bool IsExtendedKey(WPARAM vKey) {
|
||||||
|
switch (vKey) {
|
||||||
|
case VK_INSERT: case VK_DELETE: case VK_HOME: case VK_END:
|
||||||
|
case VK_PRIOR: case VK_NEXT: case VK_LEFT: case VK_UP:
|
||||||
|
case VK_RIGHT: case VK_DOWN: case VK_RCONTROL: case VK_RMENU:
|
||||||
|
case VK_DIVIDE: // 小键盘的 /
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength)
|
VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength)
|
||||||
{
|
{
|
||||||
int msgSize = sizeof(MSG64);
|
int msgSize = sizeof(MSG64);
|
||||||
@@ -1028,17 +1042,12 @@ VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength)
|
|||||||
}
|
}
|
||||||
for (int i = 0; i < ulMsgCount; ++i, ptr += msgSize) {
|
for (int i = 0; i < ulMsgCount; ++i, ptr += msgSize) {
|
||||||
MSG64* Msg = msgSize == 48 ? (MSG64*)ptr :
|
MSG64* Msg = msgSize == 48 ? (MSG64*)ptr :
|
||||||
(MSG64*)msg64.Create(msg32.Create(ptr, msgSize));
|
(MSG64*)msg64.Create(msg32.Create(ptr, msgSize));
|
||||||
switch (Msg->message) {
|
|
||||||
case WM_LBUTTONDOWN:
|
INPUT input = { 0 };
|
||||||
case WM_LBUTTONUP:
|
input.type = INPUT_MOUSE;
|
||||||
case WM_RBUTTONDOWN:
|
// 处理坐标:无论是点击还是移动,都先更新坐标
|
||||||
case WM_RBUTTONUP:
|
if (Msg->message >= WM_MOUSEFIRST && Msg->message <= WM_MOUSELAST) {
|
||||||
case WM_LBUTTONDBLCLK:
|
|
||||||
case WM_RBUTTONDBLCLK:
|
|
||||||
case WM_MBUTTONDOWN:
|
|
||||||
case WM_MBUTTONUP:
|
|
||||||
case WM_MOUSEMOVE: {
|
|
||||||
POINT Point;
|
POINT Point;
|
||||||
Point.x = LOWORD(Msg->lParam);
|
Point.x = LOWORD(Msg->lParam);
|
||||||
Point.y = HIWORD(Msg->lParam);
|
Point.y = HIWORD(Msg->lParam);
|
||||||
@@ -1049,65 +1058,93 @@ VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength)
|
|||||||
ReleaseCapture();
|
ReleaseCapture();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
// 映射到 0-65535 的绝对坐标空间
|
||||||
default:
|
if (m_ScreenSpyObject->GetScreenCount() > 1) {
|
||||||
break;
|
// 多显示器模式下,必须重新计算 dx, dy 映射到全虚拟桌面空间
|
||||||
|
// 且必须带上 MOUSEEVENTF_VIRTUALDESK 标志
|
||||||
|
input.mi.dx = ((Point.x - m_ScreenSpyObject->GetVScreenLeft()) * 65535) / (m_ScreenSpyObject->GetVScreenWidth() - 1);
|
||||||
|
input.mi.dy = ((Point.y - m_ScreenSpyObject->GetVScreenTop()) * 65535) / (m_ScreenSpyObject->GetVScreenHeight() - 1);
|
||||||
|
input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_VIRTUALDESK;
|
||||||
|
} else {
|
||||||
|
input.mi.dx = (Point.x * 65535) / (m_ScreenSpyObject->GetScreenWidth() - 1);
|
||||||
|
input.mi.dy = (Point.y * 65535) / (m_ScreenSpyObject->GetScreenHeight() - 1);
|
||||||
|
input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(Msg->message) { //端口发加快递费
|
switch (Msg->message) {
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
// 仅移动,上面已经设置了 MOUSEEVENTF_MOVE
|
||||||
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
|
input.mi.dwFlags |= MOUSEEVENTF_LEFTDOWN;
|
||||||
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
|
input.mi.dwFlags |= MOUSEEVENTF_LEFTUP;
|
||||||
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_RBUTTONDOWN:
|
case WM_RBUTTONDOWN:
|
||||||
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
|
input.mi.dwFlags |= MOUSEEVENTF_RIGHTDOWN;
|
||||||
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_RBUTTONUP:
|
case WM_RBUTTONUP:
|
||||||
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
|
input.mi.dwFlags |= MOUSEEVENTF_RIGHTUP;
|
||||||
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONDBLCLK:
|
case WM_LBUTTONDBLCLK:
|
||||||
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
|
// 前面已经收到了一个完整的 Down/Up, 这里我们只需要补一个“按下”动作, 系统就会认定这是双击
|
||||||
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
|
input.mi.dwFlags |= MOUSEEVENTF_LEFTDOWN;
|
||||||
break;
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
case WM_RBUTTONDBLCLK:
|
|
||||||
mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
|
|
||||||
mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MBUTTONDOWN:
|
case WM_MBUTTONDOWN:
|
||||||
mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);
|
input.mi.dwFlags |= MOUSEEVENTF_MIDDLEDOWN;
|
||||||
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MBUTTONUP:
|
case WM_MBUTTONUP:
|
||||||
mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);
|
input.mi.dwFlags |= MOUSEEVENTF_MIDDLEUP;
|
||||||
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
mouse_event(MOUSEEVENTF_WHEEL, 0, 0,
|
input.mi.dwFlags = MOUSEEVENTF_WHEEL;
|
||||||
GET_WHEEL_DELTA_WPARAM(Msg->wParam), 0);
|
input.mi.mouseData = GET_WHEEL_DELTA_WPARAM(Msg->wParam);
|
||||||
|
SendInput(1, &input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
case WM_SYSKEYDOWN: {
|
case WM_SYSKEYDOWN: {
|
||||||
INPUT input = { 0 };
|
INPUT k_input = { 0 };
|
||||||
input.type = INPUT_KEYBOARD;
|
k_input.type = INPUT_KEYBOARD;
|
||||||
input.ki.wVk = (WORD)Msg->wParam;
|
k_input.ki.wVk = (WORD)Msg->wParam;
|
||||||
input.ki.wScan = MapVirtualKey(Msg->wParam, 0);
|
k_input.ki.wScan = MapVirtualKey((UINT)Msg->wParam, 0);
|
||||||
input.ki.dwFlags = 0;
|
k_input.ki.dwFlags = 0;
|
||||||
SendInput(1, &input, sizeof(INPUT));
|
if (IsExtendedKey(Msg->wParam))
|
||||||
|
k_input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
|
||||||
|
SendInput(1, &k_input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
case WM_SYSKEYUP: {
|
case WM_SYSKEYUP: {
|
||||||
INPUT input = { 0 };
|
INPUT k_input = { 0 };
|
||||||
input.type = INPUT_KEYBOARD;
|
k_input.type = INPUT_KEYBOARD;
|
||||||
input.ki.wVk = (WORD)Msg->wParam;
|
k_input.ki.wVk = (WORD)Msg->wParam;
|
||||||
input.ki.wScan = MapVirtualKey(Msg->wParam, 0);
|
k_input.ki.wScan = MapVirtualKey((UINT)Msg->wParam, 0);
|
||||||
input.ki.dwFlags = KEYEVENTF_KEYUP;
|
k_input.ki.dwFlags = KEYEVENTF_KEYUP;
|
||||||
SendInput(1, &input, sizeof(INPUT));
|
if (IsExtendedKey(Msg->wParam))
|
||||||
|
k_input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
|
||||||
|
SendInput(1, &k_input, sizeof(INPUT));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user