Отслеживание мыши Mutil Monitor

Мне нужно отслеживать положение мыши. Хотя я пробовал несколько способов сделать это, я никогда не могу отслеживать / фиксировать позицию, если мышь находится на другом мониторе.

    [DllImport("user32.dll")]
    public static extern bool GetCursorPos(ref Point pt);

    [DllImport("user32.dll")]
    public static extern bool GetCursorInfo(out CURSORINFO pci);

    public void GetPosition(out int X, out int Y)
    {
        Point pt = new Point(0, 0);
        X = Y = 0;

        if (MouseMonitor.GetCursorPos(ref pt))
        {
            X = pt.X;
            Y = pt.Y;
        }

Это работает, но только на одном экране. Я также читал, что могу попробовать GetCursorInfo. Я пытался это сделать, но всегда возвращается ложное. [DllImport ("user32.dll")] общедоступный статический extern bool GetCursorInfo (из CURSORINFO pci);

Какие-либо предложения? Моя цель - отслеживать положение мыши (вне моего собственного приложения) независимо от того, на каком экране она находится.


person Jeff    schedule 23.05.2011    source источник


Ответы (2)


Ваш пример кода работает для меня в моей системе с двумя мониторами ...

На самом деле вы можете немного упростить задачу, используя .NET Framework: класс System.Windows.Forms.Cursor имеет статическое свойство Position.

Например, я создал новый проект Windows Forms, а затем перетащил System.Windows.Forms.Timer на форму. Я установил для свойства Enabled значение true и добавил этот код в событие Tick:

this.Text = string.Format("{0}, {1}", Cursor.Position.X, Cursor.Position.Y);

Запустил проект, и он работал, как ожидалось, на обоих моих мониторах ...

person James Johnston    schedule 23.05.2011
comment
Большое спасибо за ваше предложение. - person Jeff; 23.05.2011
comment
Обеспечил ли этот код какие-либо улучшения? Если нет, можете ли вы предоставить более конкретную информацию о том, как отслеживание курсора не работает на другом мониторе? - person James Johnston; 23.05.2011

Используйте DWORD GetMessagePos () - он дает вам позицию мыши последнего сообщения Windows. Но будьте осторожны, он возвращает DWORD, но внутри упакованы два SHORTS (16-битных целых числа со знаком). Так что макросы LOWORD / HIWORD (или C # соответственно) работать не будут.

http://msdn.microsoft.com/en-us/library/ms644938(VS.85).aspx

person malkia    schedule 23.05.2011