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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0128
UNGAダイアログを自動的に消す方法は?5解決


UNGA

リンク

2018/1/28(Sun) 10:03:42|NO.82358

お世話になります。

ダイアログを一定時間後に自動的に消す方法はありますか?



この記事に返信する


あまら

リンク

2018/1/28(Sun) 15:41:14|NO.82363

標準命令のdialogでは恐らくできません。

VBのWshShell:Popupメソッドを利用する形で実行は可能です。
http://hspnext.com/hspkura/hspkura06.htm#contents06

なぜか上記のソースでは消えるまでの秒数指定の引数に
ダイアログのタイプを渡しているので、
	;***** パラメータを設定 (mcall命令の中に直接記述しても可) *****
sMsg ="こんにちは。ダイアログボックスのテストです(^^)" nStyle = 2 sCaption = "WSH dialogBox Sample" nStyle|nIcon = 48 ret=WshShell("Popup",sMsg,nStyle,sCaption,nStyle|nIcon)
この箇所を

	;***** パラメータを設定 (mcall命令の中に直接記述しても可) *****
sMsg ="こんにちは。ダイアログボックスのテストです(^^)" nSec = 2 sCaption = "WSH dialogBox Sample" nStyle = 2 nIcon = 48 ret=WshShell("Popup",sMsg,nSec,sCaption,nStyle|nIcon)
勝手な修正で申し訳ないですが、このようにして下さい。

nSecの値が消えるまでの秒数です。
0にすると選択するまで消えない通常のダイアログになります。



UNGA

リンク

2018/1/28(Sun) 20:38:29|NO.82364

素早いお返事ありがとうございました。
どうしてこれでできるかは理解できませんでしたが、組み込むことはできました。これからも精進いたします。」



あまら

リンク

2018/1/28(Sun) 21:10:10|NO.82365

今更ですがPopupメソッドは消滅する時間が不安定という話もあるようなので、
ご注意ください。


ほかにも非公開APIにMessageBoxTimeOut関数なんてものもある(あった?)ようですが、
私の環境では使えなかったので省略させていただきました。



UNGA

リンク

2018/2/1(Thu) 20:32:12|NO.82384

いろいろアドバイス有難うございました。



あまら

リンク

2018/2/2(Fri) 02:01:17|NO.82387

すみません訂正します。

APIを使えば同じようなことができました。
参考URL
https://support.microsoft.com/ja-jp/help/181934/how-to-create-a-timed-message-box

ほぼそのまま流用しただけのやっつけ仕事なんで不要っぽいものもいくつかありますが、
一応動作確認はできました。
#include "user32.as"
#module MBTimer #define NULL 0 #define TRUE 1 #define FALSE 0 #define WM_CLOSE 0x0010 #define WM_QUIT 0x0012 #define WM_TIMER 0x0113 #define PM_REMOVE 0x0001 #define GW_HWNDPREV 3 #define GW_ENABLEDPOPUP 6 *CALLBACKTimer g_bTimedOut = TRUE; if(g_hWndTimedOwner): EnableWindow g_hWndTimedOwner, TRUE; GetWindow hWnd, GW_ENABLEDPOPUP; dhWnd = stat; PostMessage dhWnd, WM_CLOSE, 0, 0; return; #deffunc dialogTimer str sText, int sStyle, str sTitle, int sTime oncmd gosub *CALLBACKTimer, WM_TIMER; oncmd 0; if( sTime > 0 ) { TimerID = 1; g_bTimedOut = FALSE; g_hWndTimedOwner = NULL; hWndOwner = hWnd; IsWindowEnabled NULL; fhWndOwner = stat; if( hWndOwner && fhWndOwner): g_hWndTimedOwner = hWndOwner; oncmd 1; SetTimer hWnd, TimerID, sTime, 0; } dialog sText, sStyle, sTitle; iResult = stat; if( sTime > 0 ) { oncmd 0; KillTimer hWnd, TimerID; if(g_bTimedOut) { PeekMessage varptr(msg), dhWnd, WM_CLOSE, WM_CLOSE, PM_REMOVE; iResult = -1; } } return iResult; #global dialogTimer "3秒で閉じる", 0, "テスト1", 3000; stop
標準のdialogを呼び出し、タイマー割り込みが入ったらダイアログのみを閉じます。

dialog命令と同じ仕様で、末尾にミリ秒単位で時間を設定し
その時間が経過するとダイアログを閉じます。
時間に0やマイナス値を設定すると通常のdialog命令と同じになります。

参考URLのPostQuitMessageの箇所は、
HSPだとダイアログだけでなくメインウィンドウまで終了してしまって、
終了時割り込みを入れても無駄だったので、
ダイアログのウィンドウハンドルを取得し、ダイアログにクローズメッセージを送ることで
代用しました。

これを使う場合、なんらかの不具合があるかもしれませんがご了承ください。
改変等はご自由にどうぞ。



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