HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1014
ナノAltキーを押した時やウインドウを掴んだ時に一時停止させない方法5解決


ナノ

リンク

2020/10/14(Wed) 16:06:26|NO.91620

Altキーでポーズしている間や、マウスでウインドウを掴んで移動している間はスクリプトが一時停止していますが、一時停止させずにスクリプトを実行し続ける方法はありますか?



この記事に返信する


リンク

2020/10/14(Wed) 20:46:37|NO.91622

詳しい理由は省きますが、HSPインタプリタ上においてはそういう方法がないと思いますし、あったとしてもめっちゃハッキッシュなことをしないと実現不可能だと思います。



アイドル

リンク

2020/10/14(Wed) 21:56:24|NO.91623

ウィンドウを掴んだときに止めない方法はあったような気がしますが、
F10とaltキー押したときに無視できる方法ならあります。

「wparam」で割り込みたいやつを数値で指定すれば、割り込んで処理させないようにできます。
割り込み以外にも方法ありますが、私はこっちでなれているのでこれしか使っていません。
検索すれば出てくると思います。

また対応している数値は、getkey命令等と一緒です
http://quasiquote.org/hspwiki/HSP%25A4%25CETips:HSP%25A5%25AD%25A1%25BC%25A5%25B3%25A1%25BC%25A5%25C9%25C9%25BD

if wparam = 121 | wparam = 18 { return 1 }else{ return }



とあるプログラマ

リンク

2020/10/15(Thu) 08:55:36|NO.91624




とあるプログラマ

リンク

2020/10/15(Thu) 10:41:43|NO.91626

タイトルバードラッグの挙動を自分で再現することによってドラッグ中も停止しないコードを組んでみました。

タイマーを使う方法と違って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



ナノ

リンク

2020/10/15(Thu) 13:48:24|NO.91627

>とあるプログラマさん
そんな手があったんですね!助かりました。詳しいコードまでありがとうございます!

みなさん回答ありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.