電源OFFの検出方法について – プログラミング – Home

電源OFFの検出方法について
 
通知
すべてクリア

電源OFFの検出方法について

固定ページ 1 / 2

たて
 たて
(@たて)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

はじめまして。。。
VC++6.0 SDK ダイアログベースでプログラムを作成しております。
スタートボタンのWindowsの終了からPCの電源を落とそうとしたときに
サーバへ自分のホスト名を送信するようにしたいのですが、
思ったとおりに進まなく手詰まりになってしまいました。
よければお手数でない方は電源のOFFを検出する方法を教えて
頂けると幸いです。

参考までに自分の作成しているプログラムの概要を・・・

LAN間端末起動・終了時刻測定プログラム
・一つのプログラムでサーバ、クライアントの両方の処理ができる。
 マイドキュメントの中に作成した起動ファイルでサーバかクライアントか判別し、
 そのマシンのする処理を決定させる。
・各PCは起動時にスタートアップに入っている当プログラムを起動し、
 クライアントの場合はサーバへ自分のホスト名を送信する。
・クライアントのPCがスタートメニューからWindowsの終了をしたとき、
 サーバへもう一度自分のホスト名を送信する。

長文失礼しました。。。。。


引用解決済
トピックタグ
ぽこ
 ぽこ
(@ぽこ)
ゲスト
結合: 21年前
投稿: 23
 

うろ覚えですが、WM_ENDSESSIONかWM_QUERYENDSESSIONを受け取った時に、
電源Offかどうか判別できたと思います。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

 電源断を検出するのではなく。
 作業終了をアプリケーションで行う時にサーバへ通信してからアプリケーション
でシャットダウンしたほうがよいのでは?


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

私もアイススケーターさんの意見に一票。

WM_QUERYENDSESSIONだと他のアプリがFALSEを返したらシャットダウンされないので
目的に合わないでしょうし、WM_ENDSESSIONだとOSがどこまで操作を許してくれるか
はなはだ疑問です。Webを見てみた限りでは、OSの種類によって挙動が違うようだし。
ファイルの書き出しが出来なかった例もあるそうなのでソケットが使えるかどうかも
怪しいと思います。

常駐するそのアプリがWM_QUERYENDSESSIONでFALSEを返せばシャットダウンできないはず
なので、アプリからシャットダウンをキックする時以外はフラグをOFFにしといて
フラグOFFでWM_QUERYENDSESSIONがきたらFALSEで返却。
フラグONならWM_QUERYENDSESSIONでTRUEとする事でシャットダウンがコントロールでき
そうな気がします。もっとも、アプリをタスクマネージャーで落とされれば、
どうしようも無いですけれど。
WM_QUERYENDSESSIONがきたらFALSE返す時は、アプリからシャットダウンするように
注意を促すダイアログでも出しとけば、終了方法がわからなくなる事もないと思うし、
この方法なら確実にソケットで通信してからシャッ
トダウンされるのでよいのではないかと。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

がーん、Win9x系だとExitWindowsしたウインドウにはWM_QUERYENDSESSIONが
来ないのね。というわけで前言撤回。

よく考えたら、他のアプリが駄目を出した時の対策も取れてなかったなぁ。

確認不足のまま、投稿しちゃってすみません。


返信引用
たて
 たて
(@たて)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

返信ありがとうございます(^^;)
はやくてありがたくてびっくりです。
このプログラムは現在出されている課題なのですが、
どうもクライアント側のアプリケーションごとOSを落としたときに
信号を送信できないといけないみたいなんですよ。。。
なるほど、、、WM_ENDSESSIONを使ってコード書くと
こうでいいでしょうか・・・?

BOOL CVcKsDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_ENDSESSION){
(終了時のホスト名送信処理)
}
return CDialog::PreTranslateMessage(pMsg);
}

経験浅いので見当違いの場合申し訳ありません。。。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

姑息な手段その1
問題のアプリが裏で動く、必ずWM_QUERYENDSESSIONがきたらFALSEを返すだけの
プログラムを起動しておく。(これでメニューからのシャットダウンを抑止する)

姑息な手段その2
問題のアプリのプロトコルに電源断通知のキャンセルを追加しておいて
ExitWindows前に取り合えず、電源断通知を出しておいて、
ExitWindowsで失敗した時は、電源断通知のキャンセルを出すようにする。

いずれにしてもタスクマネージャーでどうこうされれば、役に立ちませんけどね。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

前に書いてますけれど、WM_ENDSESSIONだとソケットがうまくはれないかも
知れないです。
OSの終了時と言う状況下でOS側でどこまで規制しているかわかりません。
WM_ENDSESSIONは基本的に後始末用だと思いますし、
新たにアクションを起こしてもうまく行くかどうかは実際に検証する必要が
あるでしょう。

OS毎に挙動が違うと言う話もWeb上で紹介されていましたし、
確実に動作させるのであれば、問題ありかと。

もっとも、学校の課題とかであれば先生が考えている正解と言うのがどのレベルか
わからないので何とも言えないところですねぇ。
WM_ENDSESSIONというキーワードに到達できればよしなのか、
Win9XからXPまで全てのOSで確実な動作を求めているのか、
わかりませんから。
出題者に尋ねるのが一番でしょうけれど。

ただ尋ねるのであれば、
このWM_QUERYENDSESSIONとWM_ENDSESSIONの動作とOSによる挙動の違いを出題者に
説明できるだけのしっかりした理解がいるでしょうねぇ。
理解できれば、たとえ人から聞いた話でもあなたの知識には変わりありませんから。
ここで出てきた内容を丸写ししただけでは課題を解いた事にはなりませんもんね。


返信引用
たて
 たて
(@たて)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

なるほど、クライアントの場合は常駐にするのも手ですよね。
今までShowWindow(SW_HIDE)で隠してやってました。
PATIOさん細かい説明ありがとうございます。
そうですね・・・(^^;)
やはり自分で説明できるだけの理解が必要ですよね。
課題を出した先生もユーザー側で使う際にちょっとでも不具合があったら
徹底的に叩いてくると思うので、しっかり勉強しておくべきだと思います。。。
掲示板の質問は初めてです(^^)
参考書しか使わない作業だったのでとても助かります。
またよろしくお願いします(^^*)


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

ちょっと誤解があるようなので補足。(書き方が悪かったかもしれないけれど)

ShowWindow(SW_HIDE)で隠しても常駐には違いないような気がしますが、
アプリ側にWindowsの終了というコマンドを用意するのであれば、
ウインドウを隠していてはコマンドの実行手段を提供できないので
何らかの形で表示するようにしないと駄目ですね。(タスクトレイでも良いかと)

姑息な手段その1は、Win9xでExitWindowsを呼んだプロセスにはWM_QUERYENDSESSIONが
来ない事に対する対策です。
問題のアプリが「必ずWM_QUERYENDSESSIONがきたらFALSEを返すだけの別プログラム」を
起動しておいてメニューからのシャットダウンを抑止させようと言うことです。
これはすなわち問題のアプリのコマンドを使ってウインドウズをシャットダウンさせる
為の方策でしかありません。
目的はユーザーを問題のアプリを使ったシャットダウンに導く事にあります。
ですから、問題のアプリのコマンドでWindowsを終了しようとした時はこの裏で動いて
いるプログラムを終了させなくてはなりません。終了させた後にExitWindowsを呼び出し
ます。これによってシャットダウンの抑止が解除されてシャットダウン可能になります。

姑息な手段その2は他のアプリがWM_QUERYENDSESSIONに対してFALSEを返した時の対策で
す。これによって一度通知を出しておいてやっぱり止めたというのを可能にするというの
が目的です。結局の話、ExitWindowsを呼んでみないとシャットダウンが可能かを判断で
きないことに起因しています。

私が書いているのはあくまでもWM_ENDSESSIONでどうこうさせようという方法を対象に
書いているのではなく、問題のアプリにWindowsの終了というコマンド作成し、
それをユーザーに選ばせる事でWindowsの終了を行い、このタイミングで通知しようと
いうものである点に注意してください。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

 う~ん
 いろいろ考えられておりますが。私もクラ/サバのシステムの経験はあるのですが。
 通信異常等の異常処理を考えると確実性が無く、所詮アプリケーションで一定のシーケンス
処理をするしか無いと思うのですが。
 ちなみに、方法論は語られているのですが、目的がよく解らないのですが。教えていただけ
ます。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

確かに通信が絡む時点で通信エラーと言う問題は付いてまわるので
これが確実と言う方法はないと私も思います。

たてさんの話では課題と言う事なので結局の話、実用性がどうとかと言うような
ものでもないのかなぁと勝手に解釈していました。
実際の話、プログラムの使用目的がはっきりしないとどの程度の精度を求めているのかも
わかりませんし、通信エラーが起きた時にどうするのか言う話も出てきていませんし。
たてさんの話だけを聞いているとケーススタディ程度の内容なのかなぁとしか思いつき
ません。


返信引用
謎の怪鳥
 謎の怪鳥
(@謎の怪鳥)
ゲスト
結合: 22年前
投稿: 12
 

クライアント・サーバのいずれに対しても
システムダウンや電源OFFといった異常系動作時に
相手からの確実な応答を求める事自体に相当の無理がありますね。

一般的な通信プログラムだと
お互いの詳細状況はリアルタイムに把握できないので、
「相手からの通信が一定時間行われてこない場合には、
相手が停止したものとみなして、セッションを終了させる」
いわゆる通信タイムアウトによるセッション管理を行なうことが普通です。

通信相手の状況をリアルタイムに把握する必要がある場合には、
TCPソケットの帯域外データを使用して一定時間間隔でハートビートを出し合い、
それにより常にお互いの存在を確認する、といった対策を施すこともありますが、
これでもやはり確実性はないので、
タイムアウトによるセッション監視は必須となります。

サーバ側の仕様をもう一度確認したほうがよいかもしれませんね。

==


返信引用
たて
 たて
(@たて)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

参考になる案を多々提供して下さってありがとうございます(^^*)
課題の方はとりあえずの提出をしておけということで、
ダイアログの中に「PCの電源を切る」コマンドボタンを用意し、
(↑クライアント側のアプリケーションでのみアクティブ)
それをクリックすることによってサーバへ自分のホスト名を送信し、
その後シャットダウンするという手段をとりました。
汎用性無し、便利性あまり無しのプログラムになってしましましたが、
この問題はこれからここの掲示板で教えていただいたことを参考に
作り直してみたいと思います。
就職も目と鼻の先なのでしっかりと知識不足だということを自覚し勉強していきたいです。
メッセージの意味が理解できずMSDNライブラリをみているのですが、
どうしても意味不明で。。。。。。(*△*)

PATIOさま >> 目的は先生が来年度の生徒が使用するPCへの監視プログラム
        にすることだと言っていました。
        生徒のPCの起動時刻・終了時刻を知って使用割合や稼働率を算出
        するのでは。。。と自分では考えています。

この課題、とりあえずの提出はしましたがその後新たに問題を発見してしまいました(**)
ソケット通信、サーバ側がポート100でListenしてクライアントも全てポート100で
Connectしようとするものですからクライアントが2台3台と同時に起動(又は終了)
しようとするとエラーが起きてしまいます。
とりあえずの措置で乱数で得た値でSleepさせて時間差で送信していますが、これでは
あまりにも・・・・・(^^;)
1対1の通信だからこのようなことになるのでしょうか?
1対nの通信にできればSleepさせる必要もないと思うのですが。。。。

時間を空けてしまい申し訳ありませんでした。


返信引用
たて
 たて
(@たて)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

> PATIOさま >> 目的は先生が来年度の生徒が使用するPCへの監視プログラム
> にすることだと言っていました。
> 生徒のPCの起動時刻・終了時刻を知って使用割合や稼働率を算出
> するのでは。。。と自分では考えています。

を、
> アイススケーターさま PATIOさま >> 目的は先生が来年度の生徒が使用する
>  PCへの監視プログラム
> にすることだと言っていました。
> 生徒のPCの起動時刻・終了時刻を知って使用割合や稼働率を算出
> するのでは。。。と自分では考えています。

に修正致します。失礼しましたm(--)m


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました