📄 server.c
字号:
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);
}
else if (iMessage == 8)
{
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);
}
else if (iMessage == 9)
{
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);
}
else if (iMessage == 10)
{
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);
}
}
else
{
// 没有鼠标消息则判断是否有键盘消息
fWMKeyBdMsg = FALSE;
for (iLoop = 0;iLoop < nWMKeyBdMsg;iLoop++)
{
if (strcmp(pCommandNode->Command.szElement,WMKeyBdMsg[iLoop].szWMKeyBdMsg) == 0)
{
// 设置键盘消息标志
fWMKeyBdMsg = TRUE;
if (strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KD\0") == 0)
iMessage = 1;//按下键
else if (strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KU\0") == 0)
iMessage = 2;//松开键
// 移动到参数链表的下一个节点,Virtural 键码
pCommandNode = pCommandNode->pNext;
vk = atoi(pCommandNode->Command.szElement);
//移动到参数链表的下一个节点,按下键标志
pCommandNode = pCommandNode->pNext;
fDown = atoi(pCommandNode->Command.szElement);
// 移动到参数链表的下一个节点,按键重复数
pCommandNode = pCommandNode->pNext;
cRepeat = atoi(pCommandNode->Command.szElement);
// 移动到参数链表的下一个节点,标志位
pCommandNode = pCommandNode->pNext;
flags = atoi(pCommandNode->Command.szElement);
break;
}
}
// 如果有键盘消息,则处理键盘消息
if (fWMKeyBdMsg)
{
if (iMessage == 1) //模拟按键消息
{
keybd_event((BYTE)vk,(BYTE)vk,0,0);
}
else if (iMessage == 2) //模拟松开键的消息
{
keybd_event((BYTE)vk,(BYTE)vk,KEYEVENTF_KEYUP,0);
}
}
else // 通用消息
{
for (iLoop = 0;iLoop < nMsg;iLoop++)
{
if (strcmp(pCommandNode->Command.szElement,Msg[iLoop].szMsg) == 0)
{
if (strcmp(Msg[iLoop].szMsg,"WM_COMP\0") == 0)
{
// 移动到参数链表的下一个节点,压缩级数
pCommandNode = pCommandNode->pNext;
iCompressionLevel = atoi(pCommandNode->Command.szElement);
}
else if (strcmp(Msg[iLoop].szMsg,"WM_GRID\0") == 0)
{
// 移动到参数链表的下一个节点,x网格数
pCommandNode = pCommandNode->pNext;
nGridX = atoi(pCommandNode->Command.szElement);
// 移动到参数链表的下一个节点,y网格数
pCommandNode = pCommandNode->pNext;
nGridY = atoi(pCommandNode->Command.szElement);
// 清除当前的显示设置
ClearDisplay(hServerWnd);
// 初始化新的显示设置
InitDisplay(hServerWnd);
}
else if (strcmp(Msg[iLoop].szMsg,"WM_CMOD\0") == 0)
{
// 移动到参数链表的下一个节点,每个屏幕点的字节数
pCommandNode = pCommandNode->pNext;
bmBitsPixel = atoi(pCommandNode->Command.szElement);
ClearDisplay(hServerWnd);
InitDisplay(hServerWnd);
}
}
}
}
}
}
// 清除命令队列
Clear_Command(&CommandStart);
}
// 初始化显示变量
void InitDisplay(HWND hWnd)
{
struct GdiDS Gdi;
int iWidthX,iHeightY,nGrid;
int iXGrid,iYGrid,iLoop;
GdiStart.pNext = NULL;
pGdiNode = &GdiStart;
hDDC = CreateDC("DISPLAY",NULL,NULL,NULL);
// 得到屏幕的宽度和高度
iWidth = GetDeviceCaps(hDDC,HORZRES);
iHeight = GetDeviceCaps(hDDC,VERTRES);
// 分割屏幕成X网格区域
if (nGridX > 0)
iWidthX = iWidth/nGridX;
else
iWidthX = iWidth;
// 分割屏幕成Y网格区域
if (nGridY > 0)
iHeightY = iHeight/nGridY;
else
iHeightY = iHeight;
// 为网格创建区域的位图和Memory DC
if ((nGridX > 0) && (nGridY > 0))
{
for (iXGrid = 0;iXGrid < nGridX;iXGrid++)
{
for (iYGrid = 0;iYGrid < nGridY;iYGrid++)
{
Gdi.fChange = FALSE;
Gdi.fDIBitmap = FALSE;
Gdi.iGridX = iXGrid;
Gdi.iGridY = iYGrid;
Gdi.iWidth1 = iXGrid * iWidthX;
Gdi.iWidth2 = iXGrid * iWidthX + iWidthX;
Gdi.iHeight1 = iYGrid * iHeightY;
Gdi.iHeight2 = iYGrid * iHeightY + iHeightY;
Gdi.hMemDC = CreateCompatibleDC(hDDC);
Gdi.hDIBitmap = CreateCompatibleBitmap(hDDC,iWidthX,iHeightY);
SelectObject(Gdi.hMemDC,Gdi.hDIBitmap);
// 往队列中添加GDI信息
pGdiNode = Add_Gdi(pGdiNode,Gdi);
}
}
}
else
{
nGrid = max(nGridX,nGridY);
for (iLoop = 0;iLoop < nGrid;iLoop++)
{
Gdi.fChange = FALSE;
Gdi.fDIBitmap = FALSE;
if (nGridX > 0)
{
Gdi.iGridX = iLoop;
Gdi.iWidth1 = iLoop * iWidthX;
Gdi.iWidth2 = iLoop * iWidthX + iWidthX;
}
else
{
Gdi.iGridX = 0;
Gdi.iWidth1 = 0;
Gdi.iWidth2 = iWidthX;
}
if (nGridY > 0)
{
Gdi.iGridY = iLoop;
Gdi.iHeight1 = iLoop * iHeightY;
Gdi.iHeight2 = iLoop * iHeightY + iHeightY;
}
else
{
Gdi.iGridY = 0;
Gdi.iHeight1 = 0;
Gdi.iHeight2 = iHeightY;
}
Gdi.hMemDC = CreateCompatibleDC(hDDC);
Gdi.hDIBitmap = CreateCompatibleBitmap(hDDC,iWidthX,iHeightY);
SelectObject(Gdi.hMemDC,Gdi.hDIBitmap);
pGdiNode = Add_Gdi(pGdiNode,Gdi);
}
}
hNullDC = GetDC(NULL);
}
// 清除显示变量
void ClearDisplay(HWND hWnd)
{
DeleteDC(hDDC);
DeleteDC(hNullDC);
Clear_Gdi(&GdiStart);
}
//得到区域的显示位图
int GetRegionDisplay(HWND hWnd)
{
int iWidth1,iWidth2,iHeight1,iHeight2;
BOOL bGotBits;
DWORD iLength;
char *pStartDIB;
DWORD dwLen1;
DWORD dwBitMapHeader1;
char *pDIBitmap1;
char *pDIB1;
int fChange1;
char *pDIBChange1;
// 得到区域的矩形坐标
iWidth1 = pGdiNode->Gdi.iWidth1;
iWidth2 = pGdiNode->Gdi.iWidth2;
iHeight1 = pGdiNode->Gdi.iHeight1;
iHeight2 = pGdiNode->Gdi.iHeight2;
BitBlt(pGdiNode->Gdi.hMemDC,0,0,iWidth2,iHeight2,hDDC,iWidth1,iHeight1,SRCCOPY);
//将DDB转化成DIB
// 得到区域位图信息
GetObject(pGdiNode->Gdi.hDIBitmap,sizeof(BITMAP),&(pGdiNode->Gdi.DIBitmap));
// 设置颜色模式
pGdiNode->Gdi.DIBitmap.bmBitsPixel = bmBitsPixel;
// 初始化位图信息头
pGdiNode->Gdi.BMIH.biSize = sizeof(BITMAPINFOHEADER);
pGdiNode->Gdi.BMIH.biWidth = pGdiNode->Gdi.DIBitmap.bmWidth;
pGdiNode->Gdi.BMIH.biHeight = pGdiNode->Gdi.DIBitmap.bmHeight;
pGdiNode->Gdi.BMIH.biPlanes = 1;
pGdiNode->Gdi.BMIH.biBitCount = (WORD)pGdiNode->Gdi.DIBitmap.bmPlanes * (WORD)pGdiNode->Gdi.DIBitmap.bmBitsPixel;
pGdiNode->Gdi.BMIH.biCompression = BI_RGB;
pGdiNode->Gdi.BMIH.biSizeImage = 0;
pGdiNode->Gdi.BMIH.biXPelsPerMeter = 0;
pGdiNode->Gdi.BMIH.biYPelsPerMeter = 0;
pGdiNode->Gdi.BMIH.biClrUsed = 0;
pGdiNode->Gdi.BMIH.biClrImportant = 0;
//设置区域的颜色数
pGdiNode->Gdi.nColors = 1 << pGdiNode->Gdi.BMIH.biBitCount;
if (pGdiNode->Gdi.nColors > 256)
pGdiNode->Gdi.nColors = 0;
// 计算为位图信息头和彩色表分配内存所需的尺寸
pGdiNode->Gdi.dwLen = (DWORD)(sizeof(BITMAPINFOHEADER) + pGdiNode->Gdi.nColors * sizeof(RGBQUAD));
if (!pGdiNode->Gdi.fDIBitmap)
{
pGdiNode->Gdi.pDIB = (char *)malloc(pGdiNode->Gdi.dwLen);
pStartDIB = pGdiNode->Gdi.pDIB;
}
pGdiNode->Gdi.lpBMIH = (LPBMIH)pGdiNode->Gdi.pDIB;
*(pGdiNode->Gdi.lpBMIH) = pGdiNode->Gdi.BMIH;
GetDIBits(hNullDC,pGdiNode->Gdi.hDIBitmap,0L,(DWORD)pGdiNode->Gdi.BMIH.biHeight,(LPBYTE)NULL,(LPBITMAPINFO)pGdiNode->Gdi.lpBMIH,DIB_RGB_COLORS);
// 以计算的尺寸设置区域位图信息头
pGdiNode->Gdi.BMIH = *(pGdiNode->Gdi.lpBMIH);
// 保存位图信息头的大小
pGdiNode->Gdi.dwBitMapHeader = pGdiNode->Gdi.dwLen;
pGdiNode->Gdi.dwLen += (DWORD)(pGdiNode->Gdi.BMIH.biSizeImage);
if (!pGdiNode->Gdi.fDIBitmap)
{
pGdiNode->Gdi.pDIB = pStartDIB;
pGdiNode->Gdi.pDIB = (char *)realloc(pGdiNode->Gdi.pDIB,pGdiNode->Gdi.dwLen);
}
pGdiNode->Gdi.lpBMIH = (LPBMIH)pGdiNode->Gdi.pDIB;
bGotBits = GetDIBits(hNullDC,pGdiNode->Gdi.hDIBitmap,0L,(DWORD)pGdiNode->Gdi.BMIH.biHeight,(LPBYTE)pGdiNode->Gdi.lpBMIH + (pGdiNode->Gdi.BMIH.biSize + pGdiNode->Gdi.nColors * sizeof(RGBQUAD)),(LPBITMAPINFO)pGdiNode->Gdi.lpBMIH,DIB_RGB_COLORS);
// 比较区域DIBS之前和之后的变化
if (pGdiNode->Gdi.fDIBitmap)
{
dwLen1 = pGdiNode->Gdi.dwLen;
dwBitMapHeader1 = pGdiNode->Gdi.dwBitMapHeader;
pDIBitmap1 = pGdiNode->Gdi.pDIBitmap;
pDIB1 = pGdiNode->Gdi.pDIB;
fChange1 = pGdiNode->Gdi.fChange;
// 每次4个字节的比较两副位图,注意要跳过位图的头部
__asm
{
MOV ECX,dwLen1
SUB ECX,dwBitMapHeader1
SHR ECX,2
MOV EDX,dwBitMapHeader1
MOV ESI,pDIBitmap1
ADD ESI,EDX
MOV EDI,pDIB1
ADD EDI,EDX
REP CMPSD
JNZ SetFlagRegion1
MOV fChange1,FALSE
JMP ExitRegion1
SetFlagRegion1:
MOV fChange1,TRUE
ExitRegion1:
}
//设置变化状态
pGdiNode->Gdi.fChange = fChange1;
// 为两副区域DIB的差别建立一个新的DIB
if (pGdiNode->Gdi.fChange)
{
DWORD iZeros = 0;
iLength = (pGdiNode->Gdi.dwLen - pGdiNode->Gdi.dwBitMapHeader);
pGdiNode->Gdi.pDIBChange = pGdiNode->Gdi.pDIBChangeStart;
pDIBChange1 = pGdiNode->Gdi.pDIBChange;
__asm
{
MOV ECX,iLength
SHR ECX,2
MOV EDI,pDIBChange1
MOV ESI,pDIB1
ADD ESI,dwBitMapHeader1
MOV EDX,pDIBitmap1
ADD EDX,dwBitMapHeader1
SubtractRegion:
LODSD
SUB EAX,[EDX]
ADD EDX,4
STOSD
DEC ECX
JNZ SubtractRegion
}
//拷贝到全局区域的DIB
memblast(pGdiNode->Gdi.pDIBitmap,pGdiNode->Gdi.pDIB,pGdiNode->Gdi.dwLen);
// 设置压缩长度
pGdiNode->Gdi.dwCompress = pGdiNode->Gdi.dwLen - pGdiNode->Gdi.dwBitMapHeader;
// 设置数据的起始位
pGdiNode->Gdi.iStartPos = pGdiNode->Gdi.dwBitMapHeader;
}
}
else
{
iLength = (pGdiNode->Gdi.dwLen);
pGdiNode->Gdi.pDIBitmap = (char *)malloc(iLength);
pGdiNode->Gdi.pDIBChange = (char *)malloc(iLength);
pGdiNode->Gdi.pDIBChangeStart = pGdiNode->Gdi.pDIBChange;
memblast(pGdiNode->Gdi.pDIBitmap,pGdiNode->Gdi.pDIB,pGdiNode->Gdi.dwLen);
memblast(pGdiNode->Gdi.pDIBChange,pGdiNode->Gdi.pDIB,pGdiNode->Gdi.dwLen);
// 不需要再分配内存
pGdiNode->Gdi.fDIBitmap = TRUE;
pGdiNode->Gdi.fChange = TRUE;
pGdiNode->Gdi.dwCompress = pGdiNode->Gdi.dwLen;
pGdiNode->Gdi.iStartPos = 0;
}
return pGdiNode->Gdi.fChange;
}
// 发送Resolution到客户端
void SendResolution(SOCKET MySocket)
{
char szMessage[81];
DWORD iSent,iRecv;
// 建立屏幕宽度
memset(szMessage,'\0',sizeof(szMessage));
sprintf(szMessage,"%d",iWidth);
iSent = Transmit(MySocket,szMessage,strlen(szMessage));
// 接收确认
memset(szMessage,'\0',sizeof(szMessage));
iRecv = recv(MySocket,szMessage,81,0);
szMessage[iRecv] = '\0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -