ホーム › UI.Accessibility › UiaNodeFromPoint
UiaNodeFromPoint
関数画面座標位置のUIオートメーションノードを取得する。
シグネチャ
// UIAutomationCore.dll
#include <windows.h>
HRESULT UiaNodeFromPoint(
DOUBLE x,
DOUBLE y,
UiaCacheRequest* pRequest,
SAFEARRAY** ppRequestedData,
LPWSTR* ppTreeStructure
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| x | DOUBLE | in | 点の水平座標。 |
| y | DOUBLE | in | 点の垂直座標。 |
| pRequest | UiaCacheRequest* | inout | クライアントからの情報に対するキャッシュ要求を格納した UiaCacheRequest 構造体のアドレス。 |
| ppRequestedData | SAFEARRAY** | inout | 要求されたデータを格納する SAFEARRAY へのポインターを受け取る変数のアドレス。このパラメーターは初期化せずに渡します。 |
| ppTreeStructure | LPWSTR* | inout | ツリー構造の記述を受け取る変数のアドレス。 このパラメーターは初期化せずに渡します。「解説」を参照してください。 |
戻り値の型: HRESULT
公式ドキュメント
指定した位置にある要素の UI Automation ノードを取得します。
戻り値
解説(Remarks)
返される要素は、指定した条件に一致する UI Automation ツリー構造内で最も近い要素になります。
ツリー構造は、各文字が "p" または ")" のいずれかである文字列によって記述されます。 文字列の最初の文字は常にルートノードを表します。 関数が要素を返さない場合、この文字列は NULL になります。
"p" はノード (UI Automation 要素) を表します。"p" が別の "p" の直後に続く場合、2 番目のノードは 1 番目のノードの子です。 ")" はツリーを 1 階層戻ることを表します。たとえば、"pp)p" は、1 つのノードと、それに続く互いに兄弟である 2 つの子ノードを表します。"pp))p" では、最後のノードは最初のノードの兄弟です。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// UIAutomationCore.dll
#include <windows.h>
HRESULT UiaNodeFromPoint(
DOUBLE x,
DOUBLE y,
UiaCacheRequest* pRequest,
SAFEARRAY** ppRequestedData,
LPWSTR* ppTreeStructure
);[DllImport("UIAutomationCore.dll", ExactSpelling = true)]
static extern int UiaNodeFromPoint(
double x, // DOUBLE
double y, // DOUBLE
IntPtr pRequest, // UiaCacheRequest* in/out
IntPtr ppRequestedData, // SAFEARRAY** in/out
IntPtr ppTreeStructure // LPWSTR* in/out
);<DllImport("UIAutomationCore.dll", ExactSpelling:=True)>
Public Shared Function UiaNodeFromPoint(
x As Double, ' DOUBLE
y As Double, ' DOUBLE
pRequest As IntPtr, ' UiaCacheRequest* in/out
ppRequestedData As IntPtr, ' SAFEARRAY** in/out
ppTreeStructure As IntPtr ' LPWSTR* in/out
) As Integer
End Function' x : DOUBLE
' y : DOUBLE
' pRequest : UiaCacheRequest* in/out
' ppRequestedData : SAFEARRAY** in/out
' ppTreeStructure : LPWSTR* in/out
Declare PtrSafe Function UiaNodeFromPoint Lib "uiautomationcore" ( _
ByVal x As Double, _
ByVal y As Double, _
ByVal pRequest As LongPtr, _
ByVal ppRequestedData As LongPtr, _
ByVal ppTreeStructure As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
UiaNodeFromPoint = ctypes.windll.uiautomationcore.UiaNodeFromPoint
UiaNodeFromPoint.restype = ctypes.c_int
UiaNodeFromPoint.argtypes = [
ctypes.c_double, # x : DOUBLE
ctypes.c_double, # y : DOUBLE
ctypes.c_void_p, # pRequest : UiaCacheRequest* in/out
ctypes.c_void_p, # ppRequestedData : SAFEARRAY** in/out
ctypes.c_void_p, # ppTreeStructure : LPWSTR* in/out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('UIAutomationCore.dll')
UiaNodeFromPoint = Fiddle::Function.new(
lib['UiaNodeFromPoint'],
[
Fiddle::TYPE_DOUBLE, # x : DOUBLE
Fiddle::TYPE_DOUBLE, # y : DOUBLE
Fiddle::TYPE_VOIDP, # pRequest : UiaCacheRequest* in/out
Fiddle::TYPE_VOIDP, # ppRequestedData : SAFEARRAY** in/out
Fiddle::TYPE_VOIDP, # ppTreeStructure : LPWSTR* in/out
],
Fiddle::TYPE_INT)#[link(name = "uiautomationcore")]
extern "system" {
fn UiaNodeFromPoint(
x: f64, // DOUBLE
y: f64, // DOUBLE
pRequest: *mut UiaCacheRequest, // UiaCacheRequest* in/out
ppRequestedData: *mut *mut SAFEARRAY, // SAFEARRAY** in/out
ppTreeStructure: *mut *mut u16 // LPWSTR* in/out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("UIAutomationCore.dll")]
public static extern int UiaNodeFromPoint(double x, double y, IntPtr pRequest, IntPtr ppRequestedData, IntPtr ppTreeStructure);
"@
$api = Add-Type -MemberDefinition $sig -Name 'UIAutomationCore_UiaNodeFromPoint' -Namespace Win32 -PassThru
# $api::UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure)#uselib "UIAutomationCore.dll"
#func global UiaNodeFromPoint "UiaNodeFromPoint" double, double, sptr, sptr, sptr
; UiaNodeFromPoint x, y, varptr(pRequest), varptr(ppRequestedData), varptr(ppTreeStructure) ; 戻り値は stat
; x : DOUBLE -> "double"
; y : DOUBLE -> "double"
; pRequest : UiaCacheRequest* in/out -> "sptr"
; ppRequestedData : SAFEARRAY** in/out -> "sptr"
; ppTreeStructure : LPWSTR* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。出力引数:
#uselib "UIAutomationCore.dll" #cfunc global UiaNodeFromPoint "UiaNodeFromPoint" double, double, var, var, var ; res = UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure) ; x : DOUBLE -> "double" ; y : DOUBLE -> "double" ; pRequest : UiaCacheRequest* in/out -> "var" ; ppRequestedData : SAFEARRAY** in/out -> "var" ; ppTreeStructure : LPWSTR* in/out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "UIAutomationCore.dll" #cfunc global UiaNodeFromPoint "UiaNodeFromPoint" double, double, sptr, sptr, sptr ; res = UiaNodeFromPoint(x, y, varptr(pRequest), varptr(ppRequestedData), varptr(ppTreeStructure)) ; x : DOUBLE -> "double" ; y : DOUBLE -> "double" ; pRequest : UiaCacheRequest* in/out -> "sptr" ; ppRequestedData : SAFEARRAY** in/out -> "sptr" ; ppTreeStructure : LPWSTR* in/out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
出力引数:
; HRESULT UiaNodeFromPoint(DOUBLE x, DOUBLE y, UiaCacheRequest* pRequest, SAFEARRAY** ppRequestedData, LPWSTR* ppTreeStructure) #uselib "UIAutomationCore.dll" #cfunc global UiaNodeFromPoint "UiaNodeFromPoint" double, double, var, var, var ; res = UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure) ; x : DOUBLE -> "double" ; y : DOUBLE -> "double" ; pRequest : UiaCacheRequest* in/out -> "var" ; ppRequestedData : SAFEARRAY** in/out -> "var" ; ppTreeStructure : LPWSTR* in/out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; HRESULT UiaNodeFromPoint(DOUBLE x, DOUBLE y, UiaCacheRequest* pRequest, SAFEARRAY** ppRequestedData, LPWSTR* ppTreeStructure) #uselib "UIAutomationCore.dll" #cfunc global UiaNodeFromPoint "UiaNodeFromPoint" double, double, intptr, intptr, intptr ; res = UiaNodeFromPoint(x, y, varptr(pRequest), varptr(ppRequestedData), varptr(ppTreeStructure)) ; x : DOUBLE -> "double" ; y : DOUBLE -> "double" ; pRequest : UiaCacheRequest* in/out -> "intptr" ; ppRequestedData : SAFEARRAY** in/out -> "intptr" ; ppTreeStructure : LPWSTR* in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"math"
"golang.org/x/sys/windows"
"unsafe"
)
var (
uiautomationcore = windows.NewLazySystemDLL("UIAutomationCore.dll")
procUiaNodeFromPoint = uiautomationcore.NewProc("UiaNodeFromPoint")
)
// x (DOUBLE), y (DOUBLE), pRequest (UiaCacheRequest* in/out), ppRequestedData (SAFEARRAY** in/out), ppTreeStructure (LPWSTR* in/out)
r1, _, err := procUiaNodeFromPoint.Call(
uintptr(math.Float64bits(x)),
uintptr(math.Float64bits(y)),
uintptr(pRequest),
uintptr(ppRequestedData),
uintptr(ppTreeStructure),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // HRESULT
// 注意: float/double 引数は proc.Call では XMM レジスタに渡せません。
// windows.SyscallN(proc.Addr(), math.Float64bits(x), ...) もしくは cgo を使用してください。function UiaNodeFromPoint(
x: Double; // DOUBLE
y: Double; // DOUBLE
pRequest: Pointer; // UiaCacheRequest* in/out
ppRequestedData: Pointer; // SAFEARRAY** in/out
ppTreeStructure: PPWideChar // LPWSTR* in/out
): Integer; stdcall;
external 'UIAutomationCore.dll' name 'UiaNodeFromPoint';result := DllCall("UIAutomationCore\UiaNodeFromPoint"
, "Double", x ; DOUBLE
, "Double", y ; DOUBLE
, "Ptr", pRequest ; UiaCacheRequest* in/out
, "Ptr", ppRequestedData ; SAFEARRAY** in/out
, "Ptr", ppTreeStructure ; LPWSTR* in/out
, "Int") ; return: HRESULT●UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure) = DLL("UIAutomationCore.dll", "int UiaNodeFromPoint(double, double, void*, void*, void*)")
# 呼び出し: UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure)
# x : DOUBLE -> "double"
# y : DOUBLE -> "double"
# pRequest : UiaCacheRequest* in/out -> "void*"
# ppRequestedData : SAFEARRAY** in/out -> "void*"
# ppTreeStructure : LPWSTR* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "uiautomationcore" fn UiaNodeFromPoint(
x: f64, // DOUBLE
y: f64, // DOUBLE
pRequest: [*c]UiaCacheRequest, // UiaCacheRequest* in/out
ppRequestedData: [*c][*c]SAFEARRAY, // SAFEARRAY** in/out
ppTreeStructure: [*c][*c]u16 // LPWSTR* in/out
) callconv(std.os.windows.WINAPI) i32;proc UiaNodeFromPoint(
x: float64, # DOUBLE
y: float64, # DOUBLE
pRequest: ptr UiaCacheRequest, # UiaCacheRequest* in/out
ppRequestedData: ptr SAFEARRAY, # SAFEARRAY** in/out
ppTreeStructure: ptr WideCString # LPWSTR* in/out
): int32 {.importc: "UiaNodeFromPoint", stdcall, dynlib: "UIAutomationCore.dll".}pragma(lib, "uiautomationcore");
extern(Windows)
int UiaNodeFromPoint(
double x, // DOUBLE
double y, // DOUBLE
UiaCacheRequest* pRequest, // UiaCacheRequest* in/out
SAFEARRAY** ppRequestedData, // SAFEARRAY** in/out
wchar** ppTreeStructure // LPWSTR* in/out
);ccall((:UiaNodeFromPoint, "UIAutomationCore.dll"), stdcall, Int32,
(Float64, Float64, Ptr{UiaCacheRequest}, Ptr{SAFEARRAY}, Ptr{Ptr{UInt16}}),
x, y, pRequest, ppRequestedData, ppTreeStructure)
# x : DOUBLE -> Float64
# y : DOUBLE -> Float64
# pRequest : UiaCacheRequest* in/out -> Ptr{UiaCacheRequest}
# ppRequestedData : SAFEARRAY** in/out -> Ptr{SAFEARRAY}
# ppTreeStructure : LPWSTR* in/out -> Ptr{Ptr{UInt16}}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t UiaNodeFromPoint(
double x,
double y,
void* pRequest,
void* ppRequestedData,
uint16_t** ppTreeStructure);
]]
local uiautomationcore = ffi.load("uiautomationcore")
-- uiautomationcore.UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure)
-- x : DOUBLE
-- y : DOUBLE
-- pRequest : UiaCacheRequest* in/out
-- ppRequestedData : SAFEARRAY** in/out
-- ppTreeStructure : LPWSTR* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('UIAutomationCore.dll');
const UiaNodeFromPoint = lib.func('__stdcall', 'UiaNodeFromPoint', 'int32_t', ['double', 'double', 'void *', 'void *', 'void *']);
// UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure)
// x : DOUBLE -> 'double'
// y : DOUBLE -> 'double'
// pRequest : UiaCacheRequest* in/out -> 'void *'
// ppRequestedData : SAFEARRAY** in/out -> 'void *'
// ppTreeStructure : LPWSTR* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("UIAutomationCore.dll", {
UiaNodeFromPoint: { parameters: ["f64", "f64", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure)
// x : DOUBLE -> "f64"
// y : DOUBLE -> "f64"
// pRequest : UiaCacheRequest* in/out -> "pointer"
// ppRequestedData : SAFEARRAY** in/out -> "pointer"
// ppTreeStructure : LPWSTR* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t UiaNodeFromPoint(
double x,
double y,
void* pRequest,
void* ppRequestedData,
uint16_t** ppTreeStructure);
C, "UIAutomationCore.dll");
// $ffi->UiaNodeFromPoint(x, y, pRequest, ppRequestedData, ppTreeStructure);
// x : DOUBLE
// y : DOUBLE
// pRequest : UiaCacheRequest* in/out
// ppRequestedData : SAFEARRAY** in/out
// ppTreeStructure : LPWSTR* in/out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Uiautomationcore extends StdCallLibrary {
Uiautomationcore INSTANCE = Native.load("uiautomationcore", Uiautomationcore.class);
int UiaNodeFromPoint(
double x, // DOUBLE
double y, // DOUBLE
Pointer pRequest, // UiaCacheRequest* in/out
Pointer ppRequestedData, // SAFEARRAY** in/out
PointerByReference ppTreeStructure // LPWSTR* in/out
);
}@[Link("uiautomationcore")]
lib LibUIAutomationCore
fun UiaNodeFromPoint = UiaNodeFromPoint(
x : Float64, # DOUBLE
y : Float64, # DOUBLE
pRequest : UiaCacheRequest*, # UiaCacheRequest* in/out
ppRequestedData : SAFEARRAY**, # SAFEARRAY** in/out
ppTreeStructure : UInt16** # LPWSTR* in/out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef UiaNodeFromPointNative = Int32 Function(Double, Double, Pointer<Void>, Pointer<Void>, Pointer<Pointer<Utf16>>);
typedef UiaNodeFromPointDart = int Function(double, double, Pointer<Void>, Pointer<Void>, Pointer<Pointer<Utf16>>);
final UiaNodeFromPoint = DynamicLibrary.open('UIAutomationCore.dll')
.lookupFunction<UiaNodeFromPointNative, UiaNodeFromPointDart>('UiaNodeFromPoint');
// x : DOUBLE -> Double
// y : DOUBLE -> Double
// pRequest : UiaCacheRequest* in/out -> Pointer<Void>
// ppRequestedData : SAFEARRAY** in/out -> Pointer<Void>
// ppTreeStructure : LPWSTR* in/out -> Pointer<Pointer<Utf16>>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function UiaNodeFromPoint(
x: Double; // DOUBLE
y: Double; // DOUBLE
pRequest: Pointer; // UiaCacheRequest* in/out
ppRequestedData: Pointer; // SAFEARRAY** in/out
ppTreeStructure: PPWideChar // LPWSTR* in/out
): Integer; stdcall;
external 'UIAutomationCore.dll' name 'UiaNodeFromPoint';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "UiaNodeFromPoint"
c_UiaNodeFromPoint :: CDouble -> CDouble -> Ptr () -> Ptr () -> Ptr CWString -> IO Int32
-- x : DOUBLE -> CDouble
-- y : DOUBLE -> CDouble
-- pRequest : UiaCacheRequest* in/out -> Ptr ()
-- ppRequestedData : SAFEARRAY** in/out -> Ptr ()
-- ppTreeStructure : LPWSTR* in/out -> Ptr CWString
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let uianodefrompoint =
foreign "UiaNodeFromPoint"
(double @-> double @-> (ptr void) @-> (ptr void) @-> (ptr (ptr uint16_t)) @-> returning int32_t)
(* x : DOUBLE -> double *)
(* y : DOUBLE -> double *)
(* pRequest : UiaCacheRequest* in/out -> (ptr void) *)
(* ppRequestedData : SAFEARRAY** in/out -> (ptr void) *)
(* ppTreeStructure : LPWSTR* in/out -> (ptr (ptr uint16_t)) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library uiautomationcore (t "UIAutomationCore.dll"))
(cffi:use-foreign-library uiautomationcore)
(cffi:defcfun ("UiaNodeFromPoint" uia-node-from-point :convention :stdcall) :int32
(x :double) ; DOUBLE
(y :double) ; DOUBLE
(p-request :pointer) ; UiaCacheRequest* in/out
(pp-requested-data :pointer) ; SAFEARRAY** in/out
(pp-tree-structure :pointer)) ; LPWSTR* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $UiaNodeFromPoint = Win32::API::More->new('UIAutomationCore',
'int UiaNodeFromPoint(double x, double y, LPVOID pRequest, LPVOID ppRequestedData, LPVOID ppTreeStructure)');
# my $ret = $UiaNodeFromPoint->Call($x, $y, $pRequest, $ppRequestedData, $ppTreeStructure);
# x : DOUBLE -> double
# y : DOUBLE -> double
# pRequest : UiaCacheRequest* in/out -> LPVOID
# ppRequestedData : SAFEARRAY** in/out -> LPVOID
# ppTreeStructure : LPWSTR* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。