ウインドウクラス情報取得(T)          <TOP>


ウインドウクラスの情報を取得します。MiniMiniSpy-- はウインドウクラス情報取得(U)をご覧ください
GetWindowRect ウィンドウの座標をスクリーン座標系で取得
GetCursorPos カーソルの現在のスクリーン座標の取得
WindowFromPoint 指定の座標位置にあるウィンドウハンドルを取得
GetClassName ウィンドウのクラス名を取得
FindWindow 指定された文字列と一致するクラス名とウィンドウ名を持つトップレベルウィンドウ(親を持たないウィンドウ)のハンドルを返す
GetWindowText ウインドウのタイトル文字列を取得
SendMessage ウィンドウにメッセージを送信
 

カーソル位置のクラス名を取得し、そのハンドル・矩形領域・そのサイズを表示します。

    選択された矩形領域を薄い枠で囲むようにしてみました。少々動作が鈍いようです・・・

    Spy++や、このてのフリーソフトなどはどのようにしているのか解りませんが、Form2を用意し矩形領域に重ね透過処理をしています。

    Form2は、タイトルバー(なし)に設定していますので青フレームが無くなり見にくいかもしれません。

    サイズを合わせたPictureBoxを乗せて枠を強調してみましたが、さらに動作が鈍くなったのでやめました。

    ウインドウクラス情報取得(V) コード部下段参照

図は、右図のアドレス欄にカーソルを合わせた時の情報です。

 

FrontPageの編集領域を指示した場合の例

 

'================================================================
'= ウインドウクラス情報取得
'=    (MiniMiniSpy--.bas)
'================================================================
#include "Windows.bi"

Type POINTAPI
    x As Long
    y As Long
End Type

Type RECT
    Left   As Long
    Top    As Long
    Right  As Long
    Bottom As Long
End Type

' ウィンドウの座標をスクリーン座標系で取得
Declare Function Api_GetWindowRect& Lib "user32" Alias "GetWindowRect" (ByVal hWnd&, lpRect As RECT)

' カーソルの現在のスクリーン座標の取得
Declare Function Api_GetCursorPos& Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI)

' 指定の座標位置にあるウィンドウハンドルを取得
Declare Function Api_WindowFromPoint& Lib "user32" Alias "WindowFromPoint" (ByVal xPoint&, ByVal yPoint&)

' ウィンドウのクラス名を取得する関数の宣言
Declare Function Api_GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal hWnd&, ByVal lpClassName$, ByVal nMaxCount&)

' 指定された文字列と一致するクラス名とウィンドウ名を持つトップレベルウィンドウ(親を持たないウィンドウ)のハンドルを返す
Declare Function Api_FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$)

' ウインドウのタイトル文字列を取得
Declare Function Api_GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal hWnd&, ByVal lpString$, ByVal cch&)

' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない
Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

#define WM_GETTEXT &HD      'コントロールのキャプション・テキストをバッファにコピー

Var Shared Timer1 As Object
Var Shared Text(9) As Object
Var Shared Edit1 As Object

Timer1.Attach GetDlgItem("Timer1")
For i = 0 To 9
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i+1)))
    Text(i).SetFontSize 14
Next
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14

'================================================================
'= Chr$(0)を取り除く
'================================================================
Declare Function TrimNull (item As String) As String
Function TrimNull(item As String) As String
    Var ePos As Integer

    ePos = InStr(item, Chr$(0))
    If ePos Then
        TrimNull = Left$(item, ePos - 1)
    Else
        TrimNull = item
    End If
End Function

'================================================================
'=
'================================================================
Declare Sub Mainform_Start edecl ()
Sub Mainform_Start()
    Timer1.SetInterval 10
    Timer1.Enable -1
End Sub

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    Var pa As POINTAPI
    Var rc As RECT
    Var hWnd As Long
    Var Buff As String * 128
    Var Caption As String
    Var Ret As Long

    ' カーソル位置のスクリーン座標を取得
    Ret = Api_GetCursorPos(pa)

    ' 座標を含むウィンドウのハンドルを取得
    hWnd = Api_WindowFromPoint(pa.x, pa.y)

    ' 矩形領域を取得
    Ret = Api_GetWindowRect(hWnd, rc)

    ' ウィンドウのハンドルを取得できたとき
    If hWnd <> 0 Then

        ' カーソル座標を表示
        Text(4).SetWindowText "(" & Trim$(Str$(pa.x)) & "," & Trim$(Str$(pa.y)) & ")"

        ' 矩形座標を表示
        Text(5).SetWindowText "(" & Trim$(Str$(rc.Left)) & "," & Trim$(Str$(rc.Top)) & ")-(" & Trim$(Str$(rc.Right)) & "," & Trim$(Str$(rc.Bottom)) & ")"

        ' 矩形サイズを表示
        Text(6).SetWindowText Trim$(Str$(rc.Right - rc.Left)) & "x" & Trim$(Str$(rc.Bottom - rc.Top))

        ' ウィンドウのハンドルを表示
        Text(7).SetWindowText "&&H" & hex$(hWnd)

        ' ウィンドウのクラス名を取得
        Ret = Api_GetClassName(hWnd, Buff, Len(Buff))

        Text(8).SetWindowText TrimNull(Buff)

        ' キャプションの文字列取得表示
        Caption = space$(250)
        Ret = Api_GetWindowText(hWnd, Caption, Len(Caption))
        Ret = Api_SendMessage(hWnd, WM_GETTEXT, Len(Caption), Caption)
        Edit1.SetWindowText TrimNull(Caption)
    End If
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End


'================================================================
'= ウインドウクラス情報取得(MiniMiniSpy--)
'================================================================
#include "Windows.bi"

Type POINTAPI
    x As Long
    y As Long
End Type

Type RECT
    Left   As Long
    Top    As Long
    Right  As Long
    Bottom As Long
End Type

' ウィンドウの座標をスクリーン座標系で取得
Declare Function Api_GetWindowRect& Lib "user32" Alias "GetWindowRect" (ByVal hWnd&, lpRect As RECT)

' カーソルの現在のスクリーン座標の取得
Declare Function Api_GetCursorPos& Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI)

' 指定の座標位置にあるウィンドウハンドルを取得
Declare Function Api_WindowFromPoint& Lib "user32" Alias "WindowFromPoint" (ByVal xPoint&, ByVal yPoint&)

' ウィンドウのクラス名を取得する関数の宣言
Declare Function Api_GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal hWnd&, ByVal lpClassName$, ByVal nMaxCount&)

' 指定された文字列と一致するクラス名とウィンドウ名を持つトップレベルウィンドウ(親を持たないウィンドウ)のハンドルを返す。この関数は、子ウィンドウは探さない。検索では、大文字小文字は区別されない
Declare Function Api_FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$)

' ウインドウのタイトル文字列を取得
Declare Function Api_GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal hWnd&, ByVal lpString$, ByVal cch&)

' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない
Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

' 指定されたウィンドウに関しての情報を取得。また、拡張ウィンドウメモリから、指定されたオフセットにある32ビット値を取得することもできる
Declare Function Api_GetWindowLong& Lib "user32" Alias "GetWindowLongA" (ByVal hWnd&, ByVal nIndex&)

' 指定されたウィンドウの属性を変更。また、拡張ウィンドウメモリの指定されたオフセットの32ビット値を書き換えることができる
Declare Function Api_SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)

' レイヤード ウィンドウの不透明および透明のカラーキーを設定
Declare Function Api_SetLayeredWindowAttributes& Lib "user32" Alias "SetLayeredWindowAttributes" (ByVal hWnd&, ByVal crKey&, ByVal bAlpha&, ByVal dwFlags&)

#define WM_GETTEXT &HD        'コントロールのキャプション・テキストをバッファにコピー
#define GWL_EXSTYLE -20       '拡張ウィンドウスタイル
#define LWA_COLORKEY 1        'crKeyを透明色として使う(dwFlagsの定数)
#define LWA_ALPHA 2           'bAlphaをアルファー値として使う
#define WS_EX_LAYERED &H80000 '透明なウィンドウ属性(Windows2000以上)

Var Shared MainForm As Object
Var Shared Form2 As Object
Var Shared Timer1 As Object
Var Shared Text(9) As Object
Var Shared Edit1 As Object

MainForm.Attach GethWnd
Timer1.Attach GetDlgItem("Timer1")
For i = 0 To 9
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i+1)))
    Text(i).SetFontSize 14
Next
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14

Var Shared hWnd2 As Long

'================================================================
'= Chr$(0)を取り除く
'================================================================
Declare Function TrimNull (item As String) As String
Function TrimNull(item As String) As String
    Var ePos As Integer

    ePos = InStr(item, Chr$(0))
    If ePos Then
        TrimNull = Left$(item, ePos - 1)
    Else
        TrimNull = item
    End If
End Function

'================================================================
'=
'================================================================
Declare Sub Mainform_Start edecl ()
Sub Mainform_Start()
    ' Form2を作成しハンドル取得
    Form2.CreateWindow "Form2", 0
    hWnd2 = Form2.GethWnd

    Timer1.SetInterval 10
    Timer1.Enable -1
End Sub

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    Var pa As POINTAPI
    Var rc As RECT
    Var hWnd As Long
    Var Buff As String * 128
    Var Caption As String
    Var dwStyle As Long
    Var Ret As Long

    ' カーソル位置のスクリーン座標を取得
    Ret = Api_GetCursorPos(pa)

    ' 座標を含むウィンドウのハンドルを取得
    hWnd = Api_WindowFromPoint(pa.x, pa.y)

    ' 矩形領域を取得
    Ret = Api_GetWindowRect(hWnd, rc)

    ' 取得した矩形領域にForm2のサイズを合わせる
    Form2.MoveWindow rc.Left, rc.Top
    Form2.SetWindowSize rc.Right - rc.Left, rc.Bottom - rc.Top

    ' 拡張ウィンドウスタイルにWS_EX_LAYEREDを追加する
    dwStyle = Api_GetWindowLong(hWnd2, GWL_EXSTYLE)
    dwStyle = dwStyle Or WS_EX_LAYERED

    ' Form2ウィンドウ全体を透明にする(薄い枠のみ判断できる程度)
    Ret = Api_SetWindowLong(hWnd2, GWL_EXSTYLE, dwStyle)
    Ret = Api_SetLayeredWindowAttributes(hWnd2, Form2.GetBackColor, 0, LWA_COLORKEY)
    Form2.ShowWindow -1

    ' ウィンドウのハンドルを取得できたとき
    If hWnd <> 0 Then

        ' カーソル座標を表示
        Text(4).SetWindowText "(" & Trim$(Str$(pa.x)) & "," & Trim$(Str$(pa.y)) & ")"

        ' 矩形座標を表示
        Text(5).SetWindowText "(" & Trim$(Str$(rc.Left)) & "," & Trim$(Str$(rc.Top)) & ")-(" & Trim$(Str$(rc.Right)) & "," & Trim$(Str$(rc.Bottom)) & ")"

        ' 矩形サイズを表示
        Text(6).SetWindowText Trim$(Str$(rc.Right - rc.Left)) & "x" & Trim$(Str$(rc.Bottom - rc.Top))

        ' ウィンドウのハンドルを表示
        Text(7).SetWindowText "&&H" & hex$(hWnd)

        ' ウィンドウのクラス名を取得
        Ret = Api_GetClassName(hWnd, Buff, Len(Buff))

        Text(8).SetWindowText TrimNull(Buff)

        ' キャプション取得
        Caption = space$(250)
        Ret = Api_GetWindowText(hWnd, Caption, Len(Caption))
        Ret = Api_SendMessage(hWnd, WM_GETTEXT, Len(Caption), Caption)
        Edit1.SetWindowText TrimNull(Caption)
    End If
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End