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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0924
ゆうやんShutdownBlockReasonCreate 関数の使い方は?9解決


ゆうやん

リンク

2019/9/24(Tue) 16:14:17|NO.88498

HSPでシャットダウンメッセージを出そうと思い、色々調べてみたところ、
ShutdownBlockReasonCreate関数を見つけたのですが、HSPではどのようにして使えばいいのかわかりません。
誰か教えていただけますでしょうか。
https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-shutdownblockreasoncreate



この記事に返信する


kanamaru

リンク

2019/9/25(Wed) 11:42:03|NO.88500

調べても何の関数かよくわからないですけど、
user32.asにはないので、

#uselib "user32.dll"//もしuser32.as使っているならこの行はいらない #func ShutdownBlockReasonCreate "ShutdownBlockReasonCreate" int,str #func ShutdownBlockReasonDestroy "ShutdownBlockReasonDestroy" int ShutdownBlockReasonCreate hwnd,"なんかメッセージ" //なんか処理を書く。 ShutdownBlockReasonDestroy hwnd
で使えると思います。
https://komyoblog.wordpress.com/2016/03/27/アプリ起動中にwindowsをシャットダウンしても終了処/



ゆうやん

リンク

2019/9/25(Wed) 15:57:27|NO.88503

kanamaruさん ありがとうございます。
その方法でやっても、シャットダウンメッセージは出ませんでした。



MillkeyStars

リンク

2019/9/26(Thu) 03:25:39|NO.88509

使い方はあってるけど、HSPのシステム上、先にウィンドウメッセージを受信しプログラムが終了してしまうので、できているように思えないだけかと。

#uselib "user32.dll" #func ShutdownBlockReasonCreate "ShutdownBlockReasonCreate" int,var #func ShutdownBlockReasonDestroy "ShutdownBlockReasonDestroy" int #uselib "Kernel32.dll" #func Sleep "Sleep" int sdim Message,256 sdim MessageW,512 Message = "これはテストです。シャットダウンブロック時にメッセージを表示します。" cnvstow MessageW,Message //メッセージを wchar に変換 //シャットダウンの停止画面にメッセージを記載します。 //60秒以内にシャットダウンまたは再起動を行って表示を確認してください。 //その際必ずキャンセルボタンでデスクトップ画面に戻ってください ShutdownBlockReasonCreate hwnd,MessageW //MessageW :: wchar でなければメッセージが文字化けする Sleep 30000 //←HSPが再起動・終了ウィンドウメッセージを受信してしまうので、強制的にブロック ShutdownBlockReasonDestroy hwnd stop

デスクトップの状態のまま、独自にメッセージを出してシャットダウンをブロックする場合は、ウィンドウメッセージの WM_QUERYENDSESSION を利用すること。
http://unarist.hatenablog.com/entry/2015/06/01/235908



ゆうやん

リンク

2019/9/26(Thu) 16:56:07|NO.88510

MillkeyStarsさん ありがとうございます。
WM_QUERYENDSESSION というのは HSPでいうonexitのことでいいのでしょうか?
今、手元にパソコンがないため確認ができないのですが、こんな感じでいいのでしょうか?

#uselib "user32.dll" #func ShutdownBlockReasonCreate "ShutdownBlockReasonCreate" int,wptr;wchar(UTF-16)を使用 #func ShutdownBlockReasonDestroy "ShutdownBlockReasonDestroy" int onexit *exit stop *exit if iparam=1[ ShutdownBlockReasonCreate hwnd,"これはテストです。シャットダウンブロック時メッセージを表示します。" dialog "シャットダウンをブロックしています。",2 ShutdownBlockReasonDestroy hwnd ] end



MillkeyStars

リンク

2019/9/27(Fri) 00:02:11|NO.88516

WM_QUERYENDSESSION を利用しても、シャットダウンUIを取り消せないのでした。
XP の仕様のまま書き込みしてました、申し訳ないです。
(Windows Vista で仕様が変更され、拒否してもシャットダウンUIは表示されてしまうように変更されました。)
https://docs.microsoft.com/en-us/windows/win32/shutdown/shutdown-changes-for-windows-vista

onexit と WM_QUERYENDSESSION は、まったく違うメッセージの処理です。

WM_QUERYENDSESSION は、WM_CLOSE (onexit が依存しているメッセージ)より前に送られてきます。
その為、onexit でシャットダウンをブロック(ShutdownBlockReasonCreate をこの時点で登録)することはできません。



ooo

リンク

2019/9/27(Fri) 04:17:12|NO.88518

これでいいと思います。

#uselib "kernel32.dll" #func SetProcessShutdownParameters "SetProcessShutdownParameters" int,int #uselib "user32.dll" #func ShutdownBlockReasonCreate "ShutdownBlockReasonCreate" int,wptr #func ShutdownBlockReasonDestroy "ShutdownBlockReasonDestroy" int onexit *exit SetProcessShutdownParameters 0x4FF,0 ShutdownBlockReasonCreate hwnd,"シャットダウン中断テスト" stop *exit if iparam=1:stop ShutdownBlockReasonDestroy hwnd end



ゆうやん

リンク

2019/10/6(Sun) 19:26:24|NO.88600

MillkeyStarsさん ありがとうございます。
返信が遅くなってすみません。
onexit とは別だったんですね。知りませんでした。

iPhoneを使っていたため、スクリプトに誤りがありました。

#uselib "user32.dll" #func ShutdownBlockReasonCreate "ShutdownBlockReasonCreate" int,wptr;wchar(UTF-16)を使用 #func ShutdownBlockReasonDestroy "ShutdownBlockReasonDestroy" int onexit *exit stop *exit if iparam=1{ ShutdownBlockReasonCreate hwnd,"これはテストです。シャットダウン時にメッセージを表示します。" wait 1000 ShutdownBlockReasonDestroy hwnd } end

一応、この方法でシャットダウンメッセージは出たのですが、ダメでしょうか。



MillkeyStars

リンク

2019/10/7(Mon) 04:37:07|NO.88603

再起動・シャットダウンを取り消ししないのであればそれでいいと思いますよ。



ゆうやん

リンク

2019/10/8(Tue) 23:28:16|NO.88614

>MillkeyStarsさん 
>oooさん

onexit の方法でも多分問題無いみたいですね。
今回は oooさんの方法で試そうと思います。
ありがとうございました。



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