134 lines
4.7 KiB
C#
134 lines
4.7 KiB
C#
using System;
|
|
using System.Windows;
|
|
using System.Windows.Forms;
|
|
using Cursor = System.Windows.Forms.Cursor;
|
|
using Point = System.Drawing.Point;
|
|
using Size = System.Drawing.Size;
|
|
|
|
namespace JD.ScreenWrappers
|
|
{
|
|
/// <summary>
|
|
/// Helper class for GUI stuff.
|
|
/// </summary>
|
|
public static class GuiUtil
|
|
{
|
|
/// <summary>
|
|
/// Wraps the coordinate around the given control.
|
|
/// Also places to mouse to the new location, if wrapping is needed.
|
|
/// </summary>
|
|
/// <param name="control"></param>
|
|
/// <param name="lastMousePositionX"></param>
|
|
/// <param name="lastMousePositionY"></param>
|
|
public static void WrapAround(Window control, ref double lastMousePositionX, ref double lastMousePositionY)
|
|
{
|
|
Size screenSize = ComputeTotalScreenSize();
|
|
|
|
Point cursorPosition = Cursor.Position;
|
|
double viewWidth = control.Width;
|
|
double viewHeight = control.Height;
|
|
bool isNewPosition = false;
|
|
|
|
if (lastMousePositionX < 0 || cursorPosition.X == 0)
|
|
{
|
|
lastMousePositionX = viewWidth - 1;
|
|
isNewPosition = true;
|
|
}
|
|
else if (lastMousePositionX >= viewWidth || cursorPosition.X == screenSize.Width - 1)
|
|
{
|
|
lastMousePositionX = 0;
|
|
isNewPosition = true;
|
|
}
|
|
if (lastMousePositionY < 0 || cursorPosition.Y == 0)
|
|
{
|
|
lastMousePositionY = viewHeight - 1;
|
|
isNewPosition = true;
|
|
}
|
|
else if (lastMousePositionY >= viewHeight || cursorPosition.Y == screenSize.Height - 1)
|
|
{
|
|
lastMousePositionY = 0;
|
|
isNewPosition = true;
|
|
}
|
|
|
|
if (isNewPosition)
|
|
{
|
|
System.Windows.Point newWPFPosition = control.PointToScreen(new System.Windows.Point(lastMousePositionX, lastMousePositionY));
|
|
|
|
Point newPosition = new Point(Convert.ToInt32(newWPFPosition.X), Convert.ToInt32(newWPFPosition.Y));
|
|
|
|
if (cursorPosition != newPosition)
|
|
{
|
|
Cursor.Position = newPosition;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Wraps the coordinate around the given control.
|
|
/// Also places to mouse to the new location, if wrapping is needed.
|
|
/// </summary>
|
|
/// <param name="control"></param>
|
|
/// <param name="lastMousePositionX"></param>
|
|
/// <param name="lastMousePositionY"></param>
|
|
public static void WrapAround(IControl control, ref int lastMousePositionX, ref int lastMousePositionY)
|
|
{
|
|
Size screenSize = ComputeTotalScreenSize();
|
|
|
|
Point cursorPosition = Cursor.Position;
|
|
int viewWidth = control.Size.Width;
|
|
int viewHeigth = control.Size.Height;
|
|
bool isNewPosition = false;
|
|
|
|
if (lastMousePositionX < 0 || cursorPosition.X == 0)
|
|
{
|
|
lastMousePositionX = viewWidth - 1;
|
|
isNewPosition = true;
|
|
}
|
|
else if (lastMousePositionX >= viewWidth || cursorPosition.X == screenSize.Width - 1)
|
|
{
|
|
lastMousePositionX = 0;
|
|
isNewPosition = true;
|
|
}
|
|
if (lastMousePositionY < 0 || cursorPosition.Y == 0)
|
|
{
|
|
lastMousePositionY = viewHeigth - 1;
|
|
isNewPosition = true;
|
|
}
|
|
else if (lastMousePositionY >= viewHeigth || cursorPosition.Y == screenSize.Height - 1)
|
|
{
|
|
lastMousePositionY = 0;
|
|
isNewPosition = true;
|
|
}
|
|
|
|
if (isNewPosition)
|
|
{
|
|
Point newPosition = control.PointToScreen(new Point(lastMousePositionX, lastMousePositionY));
|
|
if (cursorPosition != newPosition)
|
|
{
|
|
Cursor.Position = newPosition;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static Size ComputeTotalScreenSize()
|
|
{
|
|
int screenWidth = 0;
|
|
int screenHeight = 0;
|
|
|
|
foreach (Screen s in Screen.AllScreens)
|
|
{
|
|
screenWidth = System.Math.Max(screenWidth, s.Bounds.Right);
|
|
screenHeight = System.Math.Max(screenHeight, s.Bounds.Bottom);
|
|
}
|
|
|
|
return new Size(screenWidth, screenHeight);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Overload for the real thing.
|
|
/// </summary>
|
|
public static void WrapAround(Control control, ref int lastMousePositionX, ref int lastMousePositionY)
|
|
{
|
|
WrapAround(new WindowsFormsControl(control), ref lastMousePositionX, ref lastMousePositionY);
|
|
}
|
|
}
|
|
}
|