【前提条件】
コールバック関数を扱うので modclbk3.hsp が必要です。
もし無ければhsp36b6以降ならHSP標準に同梱されてるようなので、そこから引っこ抜いたりしてください。
https://www.onionsoft.net/wp/archives/2144
フックを使わないとできないようです。
詳しい解説等は以下のサイトに書かれているので、もし知りたければ読んでみてください。
https://www.ipentec.com/document/csharp-show-message-box-in-center-of-owner-window
以下のコードは上のサイトの内容をHSP用に移植してみたものです。
#include "user32.as"
#include "kernel32.as"
#define global NULL $00000000
#define global WH_CBT 5
#define global MB_ICONINFORMATION $00000040
#define global MB_OK $00000000
#define global HCBT_ACTIVATE $00000005
#define global SWP_NOSIZE $00000001
#define global SWP_NOZORDER $00000004
#define global SWP_NOACTIVATE $00000010
// ================================================================
// 流れとしては
//
// 1. ボタンを押す
// 2. *ShowDialog へ飛ぶ
// 3. フックが作成される
// 4. MessageBox 関数が呼び出される
// 5. MessageBox のダイアログがアクティブになる(表示される)直前に、フックに基づき *CBTProc が呼び出される
// 6. *CBTProc で位置を調整する
// 7. MessageBoxのダイアログがアクティブになる(表示される)
// ================================================================
// modclbk3が必要です。
#include "modclbk3.hsp"
// CBTProcコールバック関数作成
newclbk3 hCBTProc, 3, *CBTProc
if (hCBTProc == NULL) : dialog "エラー1" : end
// ボタン表示
objsize 140, 20
button gosub "ダイアログ表示", *ShowDialog
stop
*ShowDialog
// スレッド識別子取得
threadId = GetCurrentThreadID()
// フック作成
hHook = SetWindowsHookEx(WH_CBT, hCBTProc, hInstance, threadId)
if (hHook == NULL) : dialog "エラー2" : return
// 標準の MessageBox 関数でダイアログ表示
MessageBox hwnd, "Hot Soup Processor", "HSP", MB_ICONINFORMATION | MB_OK
return
*CBTProc
// (ヘルプからコピペ)
// lparam には引数の配列へのメモリアドレスが、
// wparam には配列の要素数が格納されているので
// このようにして引数を受け取る
dupptr msg, lparam, wparam * 4, 4
_nCode = msg.0
_wparam = msg.1 // HCBT_ACTIVATEの場合:対象となるウィンドウのハンドル
_lparam = msg.2 // HCBT_ACTIVATEの場合:CBTACTIVATESTRUCT構造体へのハンドル (今回は使わない)
if (msg == HCBT_ACTIVATE) {
// ダイアログウィンドウの四隅の座標を取得
dim dlgRect, 4
GetWindowRect _wparam, varptr(dlgRect)
// 表示するべき座標を算出
x = ginfo_wx1 + (ginfo_sizex - (dlgRect.2 - dlgRect.0)) / 2
y = ginfo_wy1 + (ginfo_sizey - (dlgRect.3 - dlgRect.1)) / 2
// 位置を設定する
SetWindowPos _wparam, NULL, x, y, NULL, NULL, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE
// フックを解除する (絶対!!!)
UnhookWindowsHookEx hHook
}
// 次のフックを呼ぶ (絶対!!!)
return CallNextHookEx(hHook, _nCode, _wparam, _lparam)