ウィンドウ位置・サイズを設定(自分自身・外部)          <TOP>


メモ帳を起動し、その位置およびサイズ、また自分自身の位置およびサイズを設定します。

DeferWindowPos 複数ウィンドウ位置構造体に、ウィンドウの移動先の位置情報を格納

BeginDeferWindowPos 複数ウィンドウ位置構造体にメモリーを割り当て、この構造体のハンドルを返す

EndDeferWindowPos 複数のウィンドウの位置やサイズを一斉に更新

FindWindow クラス名またはキャプションを与えてウィンドウのハンドルを取得

 

図は、起動直後の状態。数値を変えて「実行」をクリックし位置およびサイズの確認をします。

自身サイズのサイズは「実行」ボタンが隠れない程度に設定してください。

 

'================================================================
'= ウィンドウ位置およびサイズを設定
'=    自分自身・外部
'=    (DeferWindowPos2.bas)
'================================================================
#include "Windows.bi"

' 複数ウィンドウ位置構造体に、ウィンドウの移動先の位置情報を格納
Declare Function Api_DeferWindowPos& Lib "user32" Alias "DeferWindowPos" (ByVal hWinPosInfo&, ByVal hWnd&, ByVal hWndInsertAfter&, ByVal x&, ByVal y&, ByVal cx&, ByVal cy&, ByVal wFlags&)

' 複数ウィンドウ位置構造体にメモリーを割り当て、この構造体のハンドルを返す
Declare Function Api_BeginDeferWindowPos& Lib "user32" Alias "BeginDeferWindowPos" (ByVal nNumWindows&)

' 複数のウィンドウの位置やサイズを一斉に更新
Declare Function Api_EndDeferWindowPos& Lib "user32" Alias "EndDeferWindowPos" (ByVal hWinPosInfo&)

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

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

#define HWND_TOP 0                      'ウィンドウをZオーダーの一番上に配置する
#define HWND_BOTTOM 1                   'ウィンドウをウィンドウリストの一番下に配置する
#define SWP_SHOWWINDOW &H40             'ウィンドウを表示する
#define vbNormalFocus 1                 '開いたアプリケーションはフォーカスを持ち、前回起動したサイズと位置に復元される
#define WM_CLOSE &H10                   'ウィンドウ或いはアプリケーションをクローズされた
#define vbNullString ByVal 0            '値0の文字列。値0を持つ文字列。空文字列ではない

Var Shared Text(3) As Object
Var Shared Edit(7) As Object
Var Shared Button1 As Object
Var Shared Button2 As Object

For i = 0 To 7
    If i < 4 Then
        Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1)))
        Text(i).SetFontSize 14
    End If
    Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1)))
    Edit(i).SetFontSize 14
Next
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Button2.Attach GetDlgItem("Button2") : Button2.SetFontSize 14

Var Shared hWnd As Long

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

    'コマンドボタンを無効に設定
    Button1.EnableWindow 0

    'メモ帳を起動
    Shell "Notepad.exe", , 5
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var ClassName As String
    Var pWnd As Long
    Var fPos(7) As Integer
    Var Ret As Long

    For i = 0 To 7
        fPos(i) = Val(Edit(i).GetWindowText)
    Next

    'クラス名でウィンドウハンドルを取得
    ClassName = "Notepad"
    hWnd = Api_FindWindow(ClassName, vbNullString)

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

        '複数ウィンドウ位置構造体のハンドルを取得
        pWnd = Api_BeginDeferWindowPos(2)

        'フォームの位置とサイズを設定
        pWnd = Api_DeferWindowPos(pWnd, GethWnd, HWND_BOTTOM, fPos(0), fPos(1), fPos(2), fPos(3), SWP_SHOWWINDOW)

        'メモ帳の位置とサイズを設定
        pWnd = Api_DeferWindowPos(pWnd, hWnd, HWND_TOP, fPos(4), fPos(5), fPos(6), fPos(7), SWP_SHOWWINDOW)

        'ウィンドウの位置とサイズを一斉に変更
        Ret = Api_EndDeferWindowPos(pWnd)
    End If
End Sub

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

    Ret = Api_SendMessage(hWnd, WM_CLOSE, 0, 0)
End Sub

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