〜 システム 〜
システムの通知を制御 (要KERNEL32.DLL)

重大なシステムエラーが発生した時、エラーダイアログが自動的に表示されるようになっていますが、
時には「プログラム側で処理したいので、表示して欲しくない」という場合もあるでしょう。
コチラにディスクを検知するサンプルを載せていますが、
フロッピーが挿入されてない時にフロッピードライブを検知しようとすると、
「ドライブにディスクがありません。」とディスク挿入を促すメッセージダイアログが表示されてしまいます。
この場合、キャンセルボタンを押してもらうことで問題なく処理終了できるのですが、
利用者がキャンセルを押さないことには先に進まないようになっており、
また、独自に表示させているわけではないので、応用が効きにくいという点があります。
メッセージ表示をどうするかは置いておいて、このダイアログを表示させないようにする方法を紹介します。
システムに処理させる内容を、呼び出し側アプリケーションに委ねるAPI関数SetErrorModeを使うことで、
呼出元プロセスにコードを送る「SEM_FAILCRITICALERRORS(=0x0001)」、
メモリの一般保護違反を起こしても表示させない「SEM_NOGPFAULTERRORBOX(=0x0002)」、
メモリ整列の違反を自動修復し、呼出元にに認識させない「SEM_NOALIGNMENTFAULTEXCEPT(=0x0004)」、
OSがファイルを見つけられなくても表示させない「SEM_NOOPENFILEERRORBOX(=0x8000)」、
以上を組み合わせて使用します。システム既定の処理に戻す際は、を指定してください。
	

sem 設定コード
設定コード非表示にするダイアログの種類を指定する。
0:システム既定設定に戻す
1:致命的エラーメッセージを非表示
2:一般保護違反時のメッセージを非表示
4:メモリ整列違反時のメッセージを非表示
32768:ファイルが存在しなかったときのメッセージを非表示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
	ll_libload kernel, "kernel32.dll"
	ll_getproc SetErrorMode, "SetErrorMode", kernel

#module
#deffunc sem int
	mref mode, 0
	ll_callfunc mode, 1, SetErrorMode@
	return
#global

	sem 0x0001 // SEM_FAILCRITICALERRORS
	dirlist check, "A:\\*.*"
	mes "Aドライブの総ファイル数は" + stat + "コです"
	sem 0x0000
	stop
 1
 2
 3
 4
 5
 6
 7
#uselib "kernel32.dll"
#func  global SetErrorMode "SetErrorMode" int

	SetErrorMode 0x0001 // SEM_FAILCRITICALERRORS
	dirlist check, "A:\\*.*"
	mes "Aドライブの総ファイル数は" + stat + "コです"
	SetErrorMode 0x0000