別プロセスウィンドウの位置・サイズを変える          <TOP>


SetWindowPos ウィンドウのサイズ、位置、および Z オーダーを設定
ShowWindow 指定されたウィンドウの表示状態を設定
GetWindowRect ウィンドウの座標をスクリーン座標系で取得
FindWindow クラス名またはキャプションを与えてウィンドウのハンドルを取得
GetDeviceCaps デバイス固有の情報を取得
SendMessage ウィンドウにメッセージを送信
GetDC 指定されたウィンドウのデバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
 

 

'================================================================
'= 別プロセスウィンドウの位置・サイズを変える
'=    (SetWindowPos2.bas)
'================================================================
#include "Windows.bi"

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

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

' 指定されたウィンドウの表示状態を設定
Declare Function Api_ShowWindow& Lib "user32" Alias "ShowWindow" (ByVal hWnd&, ByVal nCmdShow&)

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

' クラス名またはキャプションを与えてウィンドウのハンドルを取得
Declare Function Api_FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$)

' デバイス固有の情報を取得
Declare Function Api_GetDeviceCaps& Lib "gdi32" Alias "GetDeviceCaps" (ByVal hDC&, ByVal nIndex&)

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

' 指定されたウィンドウのデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

#define SWP_NOMOVE &H2                  'ウィンドウの現在位置を保持する
#define SWP_NOSIZE &H1                  'ウィンドウの現在のサイズを保持する
#define HWND_TOPMOST (-1)               'ウィンドウを常に最前面に配置
#define SW_MAXIMIZE 3                   '最大化
#define SW_MINIMIZE 6                   '指定のウィンドウをアイコン化しタスクリスト内のトップレベルウィンドウをアクティブ化
#define SW_RESTORE 9                    'ウィンドウをアクティブ化し表示。ウィンドウがアイコン化または最大化されているときは元の位置とサイズに
#define WM_CLOSE &H10                   'ウィンドウ或いはアプリケーションをクローズされた
#define HORZRES 8                       '画面の幅(ピクセル単位)
#define VERTRES 10                      '画面の高さ(ピクセル単位)

Var Shared MainForm As Object
Var Shared Picture1 As Object

MainForm.Attach GethWnd
Picture1.Attach GetDlgItem("Picture1")

Var Shared hWnd As Long
Var Shared hDC As Long

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

    Picture1.Print "この範囲内でマウスを移動 !" & Chr$(13, 10) & "終了はダブルクリック"
  
    'メモ帳を起動
    Shell "notepad.exe", , 5

    Wait 20

    'メモ帳のハンドルを取得
    hWnd = Api_FindWindow(ByVal 0, "無題 - メモ帳")
    hDC = Api_GetDC(GethWnd)

    'フォームを最前面に設定
    Ret = Api_SetWindowPos(GethWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE)
End Sub

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

    'メモ帳をアイコン化
    Ret = Api_ShowWindow(hWnd, SW_MINIMIZE)
End Sub

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

    'メモ帳を元のサイズへ戻す
    Ret = Api_ShowWindow(hWnd, SW_RESTORE)
End Sub

'================================================================
'=
'================================================================
Declare Sub Picture1_MouseMove edecl (ByVal Button%, ByVal Shift%, ByVal SX!, ByVal SY!)
Sub Picture1_MouseMove(ByVal Button%, ByVal Shift%, ByVal SX!, ByVal SY!)
    Var rct As RECT
    Var px As Long
    Var py As Long
    VAr Ret As Long
  
    '位置の計算
    px = SX! * Api_GetDeviceCaps(hDC, HORZRES) / Picture1.GetWidth
    py = SY! * Api_GetDeviceCaps(hDC, VERTRES) / Picture1.GetHeight
    
    '新しい位置に設定
    Ret = Api_SetWindowPos(hWnd, 0, px * 0.5, py * 0.5, px * 0.5 + px * 0.25, py * 0.5 + py * 0.25, 0)
    
    '新しい位置に表示
    Ret = Api_GetWindowRect(hWnd, rct)

    MainForm.SetWindowText "[ " & Trim$(Str$(rct.Left)) & "] [" & Trim$(Str$(rct.Top)) & "]"
End Sub

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

    Ret = Api_ReleaseDC(GethWnd, hDC)
    Ret = Api_SendMessage(hWnd, WM_CLOSE, 0, 0)
    End
End Sub

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