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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.87882 の関連記事表示

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

    分類:[.NET 全般] 

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

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

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

    何がしたいかというと、今話題のRPAみたいな事がやりたいです。あるWindowを認識して、さらにテキストボックスを認識して、
    そこになんらかの文字列を入力するといった事がやりたいです。
親記事 /過去ログ151より / 関連記事表示
削除チェック/

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

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

    テキストボックスと一言で言っても実態はいろいろあるので、まずは、Spy++ を使ってみるといいと思います。
記事No.87882 のレス /過去ログ151より / 関連記事表示
削除チェック/

■87889  Re[2]: windowのIDの取得方法
□投稿者/ PANG2 -(2018/07/11(Wed) 13:15:05)
記事No.87882 のレス /過去ログ151より / 関連記事表示
削除チェック/

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

    参考URLもとても勉強になりました!
記事No.87882 のレス / END /過去ログ151より / 関連記事表示
削除チェック/

■87905  Re[1]: windowのIDの取得方法
□投稿者/ 魔界の仮面弁士 -(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
記事No.87882 のレス / END /過去ログ151より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -