タイトルバードラッグの挙動を自分で再現することによってドラッグ中も停止しないコードを組んでみました。
タイマーを使う方法と違ってrepeat〜loopの範囲を標準通りに扱えるのと、タイマーの間隔に影響されない部分が大きな違いかと思います。
その代わりドラッグを自分で処理してる分、(本当に)少しカーソルの移動に対してウィンドウの移動遅延が起きますが、気になるレベルではないでしょう。
またAltはAltでのメニュー中にも処理するのではなくAltキー自体を無効化しているため、もしAltキーを使うのであれば追加の処理が必要になります。
#include "user32.as"
#include "winmm.as"
#define global WM_NCLBUTTONDOWN $000000A1
#define global WM_MOUSEMOVE $00000200
#define global WM_LBUTTONUP $00000202
#define global WM_SYSKEYDOWN $00000104
#define global HTCAPTION $00000002
#define global TRUE $00000001
#define global FALSE $00000000
#define global SWP_NOZORDER $00000004
#define global SWP_NOSIZE $00000001
#define global NULL $00000000
// ======================================================================
// 標準の await ではメッセージを処理すると残り待機時間に関わらずその時点で
// 次行に行ってしまうので、ちゃんと時間が経過するまで待機する await に置き換えるモジュール
// ======================================================================
#module
#undef await
#deffunc await int time
timeBeginPeriod 1
if (LastTick == 0) : ExitTick = timeGetTime() + time : else : ExitTick = LastTick + time
while (timeGetTime() < ExitTick)
await@hsp max(0, ExitTick - timeGetTime())
wend
await@hsp 0
LastTick = timeGetTime() //次回以降用
timeEndPeriod 1
return
#global
// ======================================================================
// モジュール終わり
// ======================================================================
screen 0
oncmd gosub *NCLBUTTONDOWN, WM_NCLBUTTONDOWN
oncmd gosub *MOUSEMOVE, WM_MOUSEMOVE
oncmd gosub *LBUTTONUP, WM_LBUTTONUP
oncmd gosub *SYSKEYDOWN, WM_SYSKEYDOWN
// *******************
// メインループ
// *******************
repeat
redraw 0
color 255, 255, 255
boxf
color
pos 0, 0
mes "cnt: " + cnt
mes "cnt = 100 で break します"
redraw 1
if (cnt == 100) : break
await 100
loop
mes "breakしました"
stop
// ==========================
// Altキー拒否
// ==========================
*SYSKEYDOWN
return 0
// ==========================
// タイトルバー(ウィンドウ)ドラッグ
// ==========================
*NCLBUTTONDOWN
if (GetActiveWindow() != hwnd) : return //戻り値を設定してはならない (標準のプロシージャに処理してもらうため)
if (wparam != HTCAPTION) : return
press = TRUE
// クリックした地点とウィンドウの左上座標の差
diffs = ginfo_wx1 - ginfo_mx, ginfo_wy1 - ginfo_my
// マウスキャプチャにより確実に処理する (終了時要解放)
SetCapture hwnd
return 0 //戻り値をセットすること (標準のプロシージャに渡さない)
// ==========================
// ドラッグ処理
// ==========================
*MOUSEMOVE
if (press) {
// ウィンドウ位置を移動
SetWindowPos hwnd, NULL, ginfo_mx + diffs.0, ginfo_my + diffs.1, NULL, NULL, SWP_NOZORDER | SWP_NOSIZE
return 1
}
return
// ==========================
// ドラッグ終了処理
// ==========================
*LBUTTONUP
if (press) {
ReleaseCapture //要解放
press = FALSE
return 1
}
return