1

メトロアプリ用のUIオートメーションクライアント(c ++)を開発しています。メトロUIで要素を取得できます。RawTreeWalkerを使用しています。

  1. 自動化ツリーの取得

    automation->get_RawViewWalker(&pTreeWalker);
    
  2. 次に、メトロアプリで要素を繰り返し取得しています

  3. UI要素のプロパティを取得する

    リストアイテムの横に画像とテキストアイテムがあります。それをクリックすると、Webページが起動します。

    リストアイテム、画像、テキストアイテムに呼び出し機能がないため、ポイントをクリックできるようにクリック可能なポイントを取得しようとしています。また、Inspect.exeを使用してUI要素を表示しています。

    inspect.exeは、listitem、image、およびtextitemのクリック可能なポイントを表示します。

    問題のある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  );
4

1 に答える 1

3

アイテムのhwndがゼロかどうかを確認してください。これは私にとって頻繁に出てきます。

カーソルを要素の中央に移動し、マウスクリックイベントを送信することで、引き続きクリックできます。

境界矩形に基づいて位置を計算できます。状況によっては、クライアントを画面座標に変換する必要がある場合があります。

長方形の境界部分は次のようなものです。

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

画面座標に変換するには、hwndを持つ要素を使用し、必要なオフセットを適用する必要があります。

編集

長方形にカーソルを置くには、PInvokeを使用します。

これが私が使っているものです(C#):

    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);
于 2012-08-13T16:16:27.733 に答える