GetClickablePoint не работает для автоматизации пользовательского интерфейса

Я разрабатываю клиент автоматизации пользовательского интерфейса (С++) для приложения метро. Я могу получить элемент в пользовательском интерфейсе метро. Я использую Raw Tree Walker.

  1. получение дерева автоматизации

    automation->get_RawViewWalker(&pTreeWalker);
    
  2. затем я повторяю и получаю элемент в приложении метро

  3. Получение свойств элемента пользовательского интерфейса

    У меня есть изображение и текстовый элемент рядом с элементом списка. При нажатии на него запускается веб-страница.

    элемент списка, изображение и текстовый элемент не имеют возможности вызова. Поэтому я пытаюсь получить Clickable Point, чтобы я мог щелкнуть точку. Я также использую Inspect.exe, чтобы увидеть элемент пользовательского интерфейса.

    inspect.exe показывает кликабельную точку для списка, изображения и текстового элемента. Но когда я

    проблематично пытаясь получить его с помощью GetClickablePoint(), я получаю gotClickable = 0, а поле POINT остается 0.hr = S = OK

    POINT clickable;   
    BOOL gotClickable;     
    hr = p1->GetClickablePoint(&clickable,&gotClickable);
    

Я хочу использовать кликабельную точку в вызове mouse_event

   VOID WINAPI mouse_event(__in  DWORD dwFlags, __in  DWORD dx, __in  DWORD dy, __in  DWORD dwData,
   __in  ULONG_PTR dwExtraInfo  );

person Chris_vr    schedule 13.08.2012    source источник
comment
Из любопытства, что делает ваш клиент автоматизации пользовательского интерфейса? Недавно я искал способы автоматизировать несколько мастеров в графическом интерфейсе Metro.   -  person Frerich Raabe    schedule 13.08.2012
comment
Он будет имитировать использование таких действий, как щелчок по изображению, захват / запись видео и фотографий и т. Д. В моем случае изображение находится внутри списка. Любое предложение @FrerichRaabe   -  person Chris_vr    schedule 13.08.2012


Ответы (1)


Проверьте, есть ли у элемента нулевой hwnd. Это часто всплывает у меня.

Вы все еще можете щелкнуть, переместив курсор в середину элемента и отправив событие щелчка мыши.

Вы можете вычислить местоположение на основе ограничивающего прямоугольника. В зависимости от ситуации вам может потребоваться преобразовать клиент в координаты экрана.

Часть ограничивающего прямоугольника выглядит примерно так:

x = left + (right - left) / 2
y = top + (bottom - top) / 2 

Чтобы преобразовать в экранные координаты, вам нужно будет использовать элемент, у которого есть hwnd, и применить необходимое смещение.

РЕДАКТИРОВАТЬ

Чтобы поместить курсор на прямоугольник, я использую PInvoke:

Вот что я использую (С#):

    public static void Click()
    {
        User32.mouse_event(WindowsConstants.MouseEventLeftDown, 0, 0, 0, IntPtr.Zero);
        User32.mouse_event(WindowsConstants.MouseEventLeftUp, 0, 0, 0, IntPtr.Zero);
    }

    public static void RightClick()
    {
        User32.mouse_event(WindowsConstants.MouseEventRightDown, 0, 0, 0, IntPtr.Zero);
        User32.mouse_event(WindowsConstants.MouseEventRightUp, 0, 0, 0, IntPtr.Zero);

    }

    public static void DoubleClick()
    {
        User32.mouse_event(WindowsConstants.MouseEventLeftDown, 0, 0, 0, IntPtr.Zero);
        User32.mouse_event(WindowsConstants.MouseEventLeftUp, 0, 0, 0, IntPtr.Zero);
        Thread.Sleep(150);
        User32.mouse_event(WindowsConstants.MouseEventLeftDown, 0, 0, 0, IntPtr.Zero);
        User32.mouse_event(WindowsConstants.MouseEventLeftUp, 0, 0, 0, IntPtr.Zero);
    }

    public const UInt32 MouseEventLeftDown = 0x0002;
    public const UInt32 MouseEventLeftUp = 0x0004;
    public const UInt32 MouseEventRightDown = 0x0008;
    public const UInt32 MouseEventRightUp = 0x00010;


    [DllImport("user32.dll")]
    public static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo);
person chrismead    schedule 13.08.2012
comment
Вам нужно поместить курсор в середину ограничивающего прямоугольника, и проблема в том, что это mouse_event? - person Chris_vr; 13.08.2012
comment
Можете сказать мне APi для размещения курсора там на прямоугольнике - person Chris_vr; 13.08.2012
comment
Упс. Вы имели в виду Cursor.Position = xxx (SetCursorPos(pt.x,pt.y);) - person chrismead; 13.08.2012