2015-09-27 6 views
0

Я использую .Net C# winforms. Я хочу переместить указатель мыши на другое приложение и увидеть позицию x, Y в кусочке, когда я перемещаю мышь по ее интерфейсу. Отображение X, Y в строке заголовка форм одобрено. Я хочу увидеть местоположение X, Y для определенного места в форме этого приложения.Как получить позицию курсора в другом приложении

Причина, по которой я хочу это сделать, состоит в том, что на интерфейсе этого приложения есть элементы управления, на которые я могу щелкнуть мышью, чтобы повернуть ручку, одним щелчком мыши на поворот ручки. Я хочу написать приложение, чтобы я мог поместить курсор мыши в эту конкретную позицию X, Y в этой форме приложения, а затем сделать программный щелчок мышью, чтобы повернуть ту же ручку в один ход. Но я хочу сделать это из своего приложения, вроде дистанционного управления, я думаю, вы могли бы сказать. Другие кнопки приложения реагируют на щелчки мыши, когда вы находитесь над правильным расположением X, Y.

Спасибо за любые указатели в правильном направлении.

ответ

2

Добавьте ярлык к своей форме и подключите его события MouseMove() и QueryContinueDrag(). Используйте API WindowFromPoint() и GetAncestor(), чтобы получить дескриптор главного окна, содержащего позицию курсора, затем используйте API ScreenToClient() для преобразования координаты экрана в клиентскую координату этой Формы. Запустите приложение и перетащите ярлык в свою форму на ручки в целевом приложении. Строка заголовка должна обновляться с помощью клиентских коордов текущей позиции мыши относительно приложения, над которым оно завершено:

private const uint GA_ROOT = 2; 

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] 
    public struct POINT 
    { 
     public int X; 
     public int Y; 
    } 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern IntPtr WindowFromPoint(int xPoint, int yPoint); 

    [System.Runtime.InteropServices.DllImport("user32.dll", ExactSpelling = true)] 
    private static extern IntPtr GetAncestor(IntPtr hwnd, uint gaFlags); 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint); 

    private void label1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      label1.DoDragDrop(label1, DragDropEffects.Copy); 
     } 
    } 

    private void label1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) 
    { 
     Point pt = Cursor.Position; 
     IntPtr wnd = WindowFromPoint(pt.X, pt.Y); 
     IntPtr mainWnd = GetAncestor(wnd, GA_ROOT); 
     POINT PT; 
     PT.X = pt.X; 
     PT.Y = pt.Y; 
     ScreenToClient(mainWnd, ref PT); 
     this.Text = String.Format("({0}, {1})", PT.X.ToString(), PT.Y.ToString()); 
    } 
+0

Это сработало отлично ... !!! Большое спасибо ... это было сложнее, чем я думал. Как я могу дать вам кредит? – user337447

+0

Вы должны использовать координаты из события MouseMove, а не Cursor.Position. Это те, которые связаны с аппаратным событием. –

+0

@user вы задали много вопросов, никогда не принимали ответа и никогда не голосовали. Можете ли вы исправить это. –

Смежные вопросы