Получение центра экрана - PullRequest
0 голосов
/ 28 марта 2019

Примечание: использование формы окна c # в Visual Studio 2017

Приведенный ниже код теперь подходит для будущего использования.

Я пытаюсь разработать код, который поможетЯ могу определить, в каком квадранте мышь находится каждые 0,5 секунды.Сначала я попытался с 0, но я обнаружил, что в c # нет отрицательного значения для позиции мыши.Поэтому вместо этого я подумал, что буду использовать ширину и высоту, с которыми я рассчитал:

 public void setScreenSize()
 {
    int W = Screen.PrimaryScreen.Bounds.Width;
    int H = Screen.PrimaryScreen.Bounds.Height;
    Console.WriteLine("Height is: " + H + "width is: " + W);
 }

полный код здесь:

public partial class Recording : Form
{

    private System.Timers.Timer mousePositionTimer;

    int W, H;


    public Recording()
    {
        InitializeComponent();
    }

    private void Recording_Load(object sender, EventArgs e)
    {
        setScreenSize();
        SetTimer(mousePositionTimer, 250,OnTimedMousePositionEvent);

    }

    public void setScreenSize()
    {
        W = Screen.PrimaryScreen.Bounds.Width;
        H = Screen.PrimaryScreen.Bounds.Height;
        Console.WriteLine("Height is: " + H + "width is: " + W);

    }


    private void SetTimer(System.Timers.Timer t, int millis, ElapsedEventHandler f)
    {
        t = new System.Timers.Timer(millis);
        t.Elapsed += f;
        t.AutoReset = true;
        t.Enabled = true;
    }

    private void OnTimedMousePositionEvent(Object source, ElapsedEventArgs e)
    {

        record.addMousePosition(W,H,MousePosition.X,MousePosition.Y);
    }



}

Затем я использовал следующее для обнаружения квадранта:

//getting position of mouse in a given quadrant
public static class record
{
     public static void addMousePosition(int w, int h, int x, int y)
     {
         if (x > w/2 && y > h/2)
             mousePositions.Add(1);
         else if (x > w/2 && y <= h/2)
             mousePositions.Add(2);
         else if (x <= w/2 && y <= h/2)
             mousePositions.Add(3);
         else if (x <= w/2 && y > h/2)
             mousePositions.Add(4);
     }
}

Однако, когда я печатаю свой список, я всегда получаю Квадрант 1.Есть ли лучший способ получить центр экрана, чтобы я мог правильно выполнять свои условия?

Пожалуйста, помните, что я пытаюсь сделать это вне формы, а не обязательно на ней.

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Сфера вопроса?

public void setScreenSize()
{
    int W = Screen.PrimaryScreen.Bounds.Width;
    int H = Screen.PrimaryScreen.Bounds.Height;
    Console.WriteLine("Height is: " + H + "width is: " + W);
}

до

public void setScreenSize()
{
    W = Screen.PrimaryScreen.Bounds.Width;
    H = Screen.PrimaryScreen.Bounds.Height;
    Console.WriteLine("Height is: " + H + "width is: " + W);
}
0 голосов
/ 28 марта 2019

Подводя итог моим комментариям сверху:

Когда вы звоните setScreenSize() из OnFormLoad(), вы будете устанавливать только локальные переменные W и H, которые вы определили в ваших методах.

public void setScreenSize()
{
    int W = Screen.PrimaryScreen.Bounds.Width;
    int H = Screen.PrimaryScreen.Bounds.Height;
    Console.WriteLine("Height is: " + H + "width is: " + W);
}

Таким образом, эти переменные будут скрывать ваши поля, которые вы объявили в

public partial class Recording : Form
{
    private System.Timers.Timer mousePositionTimer;

    int W, H;

    ...
}

Таким образом, поскольку поля класса не инициализированы, они имеют default(int) значение 0.

Когда вы сейчас звоните своему addMousePosition(), вы всегда будете использовать 0 по умолчанию вместо реальных значений, которые вы сохранили в локальных int H и int W

private void OnTimedMousePositionEvent(Object source, ElapsedEventArgs e)
{
    record.addMousePosition(W,H,MousePosition.X,MousePosition.Y);
}

public static void addMousePosition(int w, int h, int x, int y)
{
    if (x > w/2 && y > h/2)
        mousePositions.Add(1);
     else if (x > w/2 && y <= h/2)
         mousePositions.Add(2);
     else if (x <= w/2 && y <= h/2)
         mousePositions.Add(3);
     else if (x <= w/2 && y > h/2)
         mousePositions.Add(4);
 }

и т. Д.Ваш код будет Add(1) большую часть времени.Только в верхнем левом углу экрана вы должны попасть в ветку Add(3).

Таким образом, удаление int в передней части локальных W и H решит проблему.

public void setScreenSize()
{
    W = Screen.PrimaryScreen.Bounds.Width;
    H = Screen.PrimaryScreen.Bounds.Height;
    Console.WriteLine("Height is: " + H + "width is: " + W);
}

Для уточнения рекомендую использовать this.:

public void setScreenSize()
{
    this.W = Screen.PrimaryScreen.Bounds.Width;
    this.H = Screen.PrimaryScreen.Bounds.Height;
    Console.WriteLine("Height is: " + this.H + "width is: " + this.W);
}

Узел сайта:

упсправы!Интересно, почему он не жаловался на это

Я также думал, что VS2017 даст подсказку об этом, но это не так.Resharper предоставляет подсказку:

Локальная переменная H скрывает поле int Recording.H

0 голосов
/ 28 марта 2019

Я бы создал 4 Rectangle с, затем использовал бы Rectangle.Contains, чтобы проверить, где находится мышь:

Rectangle topLeft, topRight, bottomLeft, bottomRight;

void CalculateQuadrants(Form mainForm)
{
     Screen myScreen = Screen.FromControl(mainForm);
     Rectangle area = myScreen.WorkingArea;
     topLeft = new Rectangle(area.Left, area.Top, area.Right/2, area.Bottom/2);
     topRight = new Rectangle(area.Right/2, area.Top, area.Right/2, area.Bottom/2);
     bottomLeft = new Rectangle(area.Left, area.Bottom/2, area.Right/2, area.Bottom/2);
     bottomRight = new Rectangle(area.Right/2, area.Bottom/2, area.Right/2, area.Bottom/2);
}

Тогда вы можете сделать простой. Содержит проверить указатель мыши:

public static void addMousePosition(Point mousePosition)
{
    if (topLeft.Contains(mousePosition))
        mousePositions.Add(1);
    else if (topRight.Contains(mousePosition))
        mousePositions.Add(2);
    else if (bottomLeft.Contains(mousePosition))
        mousePositions.Add(3);
    else if (bottomRight.Contains(mousePosition))
        mousePositions.Add(4);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...