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

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

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

Re[1]: windowのIDの取得方法


(過去ログ 151 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■87882 / inTopicNo.1)  windowのIDの取得方法
  
□投稿者/ サンタクロース村 (1回)-(2018/07/11(Wed) 10:21:37)

分類:[.NET 全般] 

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

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

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

何がしたいかというと、今話題のRPAみたいな事がやりたいです。あるWindowを認識して、さらにテキストボックスを認識して、
そこになんらかの文字列を入力するといった事がやりたいです。
引用返信 編集キー/
■87883 / inTopicNo.2)  Re[1]: windowのIDの取得方法
□投稿者/ とっちゃん (500回)-(2018/07/11(Wed) 10:54:55)
No87882 (サンタクロース村 さん) に返信
> 知りたいのは、どのような関数を使ってマウスカーソルがあたった箇所のコントロールなどを認識できるんでしょうか?
>
WindowFromPoint というAPIを使っていると思います。
あえて、定義とかは書きません。ここ程度は自力でクリアできないとその先が無理なので。。。

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

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

引用返信 編集キー/
■87889 / inTopicNo.3)  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
引用返信 編集キー/
■87904 / inTopicNo.4)  Re[3]: windowのIDの取得方法
□投稿者/ サンタクロース村 (2回)-(2018/07/12(Thu) 09:46:01)
ありがとうございます。やりたいことが実現できそうな感じです!

参考URLもとても勉強になりました!
解決済み
引用返信 編集キー/
■87905 / inTopicNo.5)  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
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -