C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

windowのIDの取得方法 /サンタクロース村 (18/07/11(Wed) 10:21) #87882
Re[1]: windowのIDの取得方法 /とっちゃん (18/07/11(Wed) 10:54) #87883
│└ Re[2]: windowのIDの取得方法 /PANG2 (18/07/11(Wed) 13:15) #87889
│  └ Re[3]: windowのIDの取得方法 /サンタクロース村 (18/07/12(Thu) 09:46) #87904 解決済み
Re[1]: windowのIDの取得方法 /魔界の仮面弁士 (18/07/12(Thu) 10:30) #87905 解決済み


親記事 / ▼[ 87883 ] ▼[ 87905 ]
■87882 / 親階層)  windowのIDの取得方法
□投稿者/ サンタクロース村 (1回)-(2018/07/11(Wed) 10:21:37)

分類:[.NET 全般] 

キャプチャソフトで見かけるのですが、Windowのボタンにカーソルをあてるとボタンが点線で囲まれ、
テキストボックスにカーソルがあてるとテキストボックスが点線で囲まれたりするソフトを見ます。

さらにWindow上部のバーにカーソルをあてるとWindow全体が点線で囲まれます。
そのままエンターキーを押すと、その部分のみがキャプチャされます。

知りたいのは、どのような関数を使ってマウスカーソルがあたった箇所のコントロールなどを認識できるんでしょうか?

何がしたいかというと、今話題のRPAみたいな事がやりたいです。あるWindowを認識して、さらにテキストボックスを認識して、
そこになんらかの文字列を入力するといった事がやりたいです。
[ □ Tree ] 返信 編集キー/

▲[ 87882 ] / ▼[ 87889 ]
■87883 / 1階層)  Re[1]: windowのIDの取得方法
□投稿者/ とっちゃん (500回)-(2018/07/11(Wed) 10:54:55)
No87882 (サンタクロース村 さん) に返信
> 知りたいのは、どのような関数を使ってマウスカーソルがあたった箇所のコントロールなどを認識できるんでしょうか?
>
WindowFromPoint というAPIを使っていると思います。
あえて、定義とかは書きません。ここ程度は自力でクリアできないとその先が無理なので。。。

> 何がしたいかというと、今話題のRPAみたいな事がやりたいです。あるWindowを認識して、さらにテキストボックスを認識して、
> そこになんらかの文字列を入力するといった事がやりたいです。

テキストボックスと一言で言っても実態はいろいろあるので、まずは、Spy++ を使ってみるといいと思います。

[ 親 87882 / □ Tree ] 返信 編集キー/

▲[ 87883 ] / ▼[ 87904 ]
■87889 / 2階層)  Re[2]: windowのIDの取得方法
□投稿者/ PANG2 (219回)-(2018/07/11(Wed) 13:15:05)
C#で他アプリケーションを操作するための基礎知識
http://tech.sanwasystem.com/entry/2015/11/25/171004

指定された座標を含むウィンドウのハンドルを取得する(WindowFromPoint)
http://naoko.wankuma.com/win32api/win32api_0010_WindowFromPoint.html
[ 親 87882 / □ Tree ] 返信 編集キー/

▲[ 87889 ] / 返信無し
■87904 / 3階層)  Re[3]: windowのIDの取得方法
□投稿者/ サンタクロース村 (2回)-(2018/07/12(Thu) 09:46:01)
ありがとうございます。やりたいことが実現できそうな感じです!

参考URLもとても勉強になりました!
解決済み
[ 親 87882 / □ Tree ] 返信 編集キー/

▲[ 87882 ] / 返信無し
■87905 / 1階層)  Re[1]: windowのIDの取得方法
□投稿者/ 魔界の仮面弁士 (1738回)-(2018/07/12(Thu) 10:30:52)
No87882 (サンタクロース村 さん) に返信
> 知りたいのは、どのような関数を使ってマウスカーソルがあたった箇所のコントロールなどを認識できるんでしょうか?


API 宣言無しで、.NET Framework のみで検出してみたパターン。
とりあえず VB + WinForms で書いてみました。

フォームに 幅広の ListBox を 2 つと
Timer を 1 つ貼っておいてください。


Option Strict On
Public Class Form1
  Private desktop As AccessibleObject
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim ao = Me.AccessibilityObject
    desktop = ao.Parent.Parent
    Timer1.Interval = 64
    Timer1.Start()
  End Sub

  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim p = MousePosition
    Me.Text = p.ToString()

    Dim o1 = desktop.HitTest(p.X, p.Y)
    Dim o2 = o1
    If o1 IsNot Nothing Then
      Dim o3 = o2.HitTest(p.X, p.Y)
      Do Until o3 Is Nothing
        o2 = o3
        o3 = o2.HitTest(p.X, p.Y)
      Loop
    End If

    ListBox1.DataSource = GetInfo(o1).ToArray()
    ListBox2.DataSource = GetInfo(o2).ToArray()
  End Sub

  Private Iterator Function GetInfo(ao As AccessibleObject) As IEnumerable(Of String)
    Yield "Bounds = " & ReadValue(Function() ao.Bounds).ToString()
    Yield "Name = " & ReadValue(Function() ao.Name,)
    Yield "KeyboardShortcut = " & ReadValue(Function() ao.KeyboardShortcut)
    Yield "Description = " & ReadValue(Function() ao.Description)
    Yield "Help = " & ReadValue(Function() ao.Help)
    Yield "State = " & ReadValue(Function() ao.State).ToString("F")
    Yield "Value = " & ReadValue(Function() ao.Value)
  End Function

  Private Function ReadValue(Of T)(lamda As Func(Of T), Optional defaultValue As T = Nothing) As T
    Try
      Return lamda()
    Catch
      Return defaultValue
    End Try
  End Function
End Class
解決済み
[ 親 87882 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -