ウインドウクラス情報取得(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