クラス名の取得          <TOP>


GetClassName ウィンドウのクラス名を取得

GetFocus フォーカスを持つウィンドウハンドルを取得

GetForegroundWindow ユーザーが操作中のウインドウを取得

GetWindowThreadProcessId ウィンドウのプロセスIDとスレッドIDを取得

SendMessage ウィンドウにメッセージを送信

AttachThreadInput 特定のスレッドの入力処理機構を別のスレッドにアタッチ

SetWindowPos  ウィンドウのサイズ、位置、および Z オーダーを設定

 
 
'================================================================
'= クラス名の取得
'=    (AttachThreadInput.bas)
'================================================================
#include "Windows.bi"

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

' フォーカスを持つウィンドウハンドルを取得
Declare Function Api_GetFocus& Lib "user32" Alias "GetFocus" ()

' ユーザーが操作中のウインドウを取得
Declare Function Api_GetForegroundWindow& Lib "user32" Alias "GetForegroundWindow" ()

' ウィンドウのプロセスIDとスレッドIDを取得
Declare Function Api_GetWindowThreadProcessId& Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hWnd&, lpdwProcessId&)

' ウィンドウにメッセージを送信
Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

' 特定のスレッドの入力処理機構を別のスレッドにアタッチ
Declare Function Api_AttachThreadInput& Lib "user32" Alias "AttachThreadInput" (ByVal idAttach&, ByVal idAttachTo&, ByVal fAttach&)

' ウィンドウのサイズ、位置、および Z オーダーを設定
Declare Function Api_SetWindowPos& Lib "user32" Alias "SetWindowPos" (ByVal hWnd&, ByVal hWndInsertAfter&, ByVal X&, ByVal Y&, ByVal CX&, ByVal CY&, ByVal uFlags&)

#define HWND_BOTTOM 1                   'ウィンドウを最背面に配置
#define HWND_NOTOPMOST (-2)             'ウィンドウを常に最前面に配置(他のウィンドウがHWND_TOPMOSTに配置されている場合はその配下)
#define HWND_TOP 0                      'ウィンドウを最前面に配置
#define HWND_TOPMOST (-1)               'ウィンドウを常に最前面に配置

#define SWP_DRAWFRAME &H20              '再描画のときウィンドウを囲む枠も描画
#define SWP_FRAMECHANGED &H20           'ウィンドウのサイズ変更中でなくてもWM_NCCALCSIZEを送る
#define SWP_HIDEWINDOW &H80             'ウィンドウを隠す
#define SWP_NOACTIVATE &H10             'ウィンドウをアクティブにしない
#define SWP_NOCOPYBITS &H100            'クライアント領域の内容をクリアする
#define SWP_NOMOVE &H2                  'ウィンドウの現在位置を保持する
#define SWP_NOOWNERZORDER &H200         'オーナーウィンドウのZオーダーは変えない
#define SWP_NOREDRAW &H8                'ウィンドウを自動的に再描画しない
#define SWP_NOREPOSITION &H200          'SWP_NOOWNERZORDERと同じ
#define SWP_NOSIZE &H1                  'ウィンドウの現在のサイズを保持する
#define SWP_NOZORDER &H4                'ウィンドウリスト内での現在位置を保持する
#define SWP_SHOWWINDOW &H40             'ウィンドウを表示する

Var Shared hWndCtrl As Long

Var Shared Timer1 As Object
Var Shared Edit1 As Object

Timer1.Attach GetDlgItem("Timer1")
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub GetControl()
Sub GetControl()
    Var Buffer As String
    Var CurrentThreadID As Long
    Var OtherThreadID As Long
    Var Thread1 As Long
    Var Thread2 As Long
    Var bMerker As Integer
    Var Ret As Long

    'カレントスレッド取得          
    Thread1 = Api_GetWindowThreadProcessId(GethWnd, CurrentThreadID)

    'ユーザーが操作中のウインドウを取得
    Thread2 = Api_GetWindowThreadProcessId(Api_GetForegroundWindow, OtherThreadID)
         
    'スレッドをAttach
    If Thread1 <> Thread2 Then bMerker = Api_AttachThreadInput(Thread2, Thread1, True)
    
    Ret = Api_GetFocus()
    hWndCtrl = Ret
    Edit1.SetWindowText Str$(Ret)

    'スレッドをDetach    
    If bMerker Then bMerker = Api_AttachThreadInput(Thread2, Thread1, False)
    
    'クラス名取得
    Buffer$ = Space$(255)
    Ret = Api_GetClassName(hWndCtrl, Buffer, Len(Buffer))
    Edit1.SetWindowText Buffer
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var Ret As Long

    '自身を最前面に
    Ret = Api_SetWindowPos(GethWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)

    Timer1.SetInterval 50
    Timer1.Enable -1
End Sub

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    GetControl
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    End
End Sub

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