只今、OSがシャットダウン中なのかどうか、
そのステータスを取得する方法を知りたいのですが分かりません。

対象OSはWindows9X,NT系全般で、
マイクロソフト系のC言語、でDLLとして作成出来る手段であれば構いません。
最後には結果をVBに渡します。

このシャットダウン中を知りたい理由についてですが、
今挑戦中のものは他のアプリケーションを監視することが目的で、
任意の常駐アプリケーションが常に起動しているかどうかをチェックしています。
起動状態にない場合は何らかのアクションを起こすように設定出来たりするのですが、
シャットダウン中に監視対象の方が先に終了し、
自アプリが健在であるタイミングがまれに発生します。
このとき、シャットダウン中にも関わらずチェック処理が実行され、
起動していなくて当然なのに起動していないよというエラーを出してしまうのです。
この状態を回避する方法として、
OSがシャットダウン中の場合はチェック処理をスキップする。
という方法を思いついたのですが、
この方法が見つかりません。

どなたか、方法をご存知の方、またはもっと良いノウハウをお持ちの方がいらっしゃいましたら、よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

VB で QueryUnload イベント時に(終了しても良いかの問い合わせ時に)第2引数 unloadmode に vbAppWindows が渡されたときが確かシャットダウンが原因で、アプリが終了させられるというような意味だったと思います。



C/C++でやるなら、WM_ENDSESSION メッセージの wParam パラメータが TRUE であるとき、シャットダウン中のようです。

MSDN の ExitWindows API の所をポイントしておきます。
詳しいことは、ここの「解説」の所を読んでみてください。

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

これで解決のきっかけが掴めそうです。

本当にありがとうございました。

お礼日時:2002/02/16 18:28

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q遠隔操作でシャットダウンするコマンドあるいはその他の方法

LANでつながったPCを遠隔操作でシャットダウンさせようと考えています。
特にシャットダウン用のソフトを使わないでも、Windowsに最初から備わっている機能でシャットダウンさせる方法は無いでしょうか?

また、学校のPCを使っていると「このコンピュータはネットワークの管理者によりシャットダウンが開始されました。あと○分でシャットダウンされます。終了される前にデータを保存して下さい。」というような趣旨の表示が出て、ネットワーク管理者が一斉に管理下のPCを遠隔操作でシャットダウンしてしまうのですが、これはどういう方法でやっているのでしょうか?

もしできるとすれば、このあと○分でシャットダウンというのを自分で好きなように30分とか120分とか指定することは出来るのでしょうか?

またシャットダウンではなく、スタンバイや休止状態にさせることも可能なのでしょうか?

ご回答よろしくお願いします。

Aベストアンサー

XP でしたら標準でリモートシャットダウンコマンドを持っています。
下記の情報を参照してみてください。

http://www.atmarkit.co.jp/fwin2k/win2ktips/374rmtshutdown/rmtshutdown.html

ちなみに

> 「このコンピュータはネットワークの管理者によりシャットダウンが開始されました。あと○分でシャットダウンされます。終了される前にデータを保存して下さい。」

というメッセージは上の方法でシャットダウンをかけたときに表示されるものです。

Q対象のアプリケーションが終了するまで起動し続ける

WaitForSingleObjectを使って対象のアプリケーションが終了するまで
無限ループして対象のアプリケーションが終了したら無限ループを
抜ける事はできるでしょうか?あまりWaitForSingleObjectを理解していないので
意味がわからない質問かもしれませんが、よろしくお願いします。

Aベストアンサー

>補足にかけなかったのですがfor(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) {
>でfor文のループを回したらGetAsyncKeyStateを使えますが1秒で終了してしまいます

で、今はどう書いているんです?
# まぁ、内容がアレなのでforループではなくwhileループでもいいんですけどね。

while(WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT) {
 //終了待ちの間に実行したい処理(間隔はWaitForSingleObject()の第2引数の値次第)
}
って感じですかねぇ。

QQNXのシャットダウンコマンド

Linuxは、halt -p というコマンドで、
シャットダウンしつつ電源のパワーオフまで可能ですが、
QNXにはパワーオフまで出来るコマンド及びオプションは無いのでしょうか?

Aベストアンサー

ざっと見た感じ、電源断までを一括で行うコマンドは、標準ではなさそうですね。
QNX自身が組込み用のOSなので、APMやACPIはサポートしていないようです。

回答になっていませんが、参考URLを付けときます。

参考URL:http://www.qnx.co.jp/developers/docs/6.3.0SP1JP/neutrino_ja/sys_arch/power.html?printable=1%22

Q対象のアプリケーションが終了するまで起動し続ける

C言語でメモ帳を起動している間だけ作ったプログラムが起動し続け
メモ帳が終了したらプログラムも終了する方法がありますでしょうか?

メモ帳が起動しているときは「起動しています」と無限ループで出て

メモ帳を終了したときは1回だけ「終了しました」と出るようにしたいです。

Aベストアンサー

起動中のプロセス名の一覧を取得して、その中に「notepad.exe」(メモ帳の場合)が存在するかどうかを確認することで、監視してはどうでしょう?

試しにコードを書いてみました。
あんまりうまくは書けてないですが参考にしてみてください。
コンパイルする時には、 psapi.lib をリンクしてやる必要があります。

実行してみるとわかりますが、わりとCPUパワーを食います。
少しくらいのタイムラグが許容できるなら continue の直前に Sleep(100) とか入れるとマシになるかもしれません。


////////////

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <psapi.h>

#define MAX_STR 500
#define MAX_ARRAY 1024

int main() {
DWORD procIdList[MAX_ARRAY];
DWORD retSize;
int nProc;
int i;
char procName[MAX_STR];
HANDLE hProcess;
HMODULE hMod;


//メモ帳を起動してやる
WinExec("notepad.exe", SW_SHOWNORMAL);

//無限ループでメモ帳が起動中か監視する
for (;;) {
//プロセスIDの一覧を取得
if (!EnumProcesses(procIdList, sizeof(procIdList), &retSize)) {
printf("EnumProcesses関数が失敗\n");
return 1;
}

nProc = retSize / sizeof(DWORD);
//printf("%d個のプロセス\n", nProc);

for (i = 0; i < nProc; i++) {
strcpy(procName, "");
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, procIdList[i]);

if (hProcess != NULL) {
//プロセス名の取得
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &retSize)) {
GetModuleBaseName(hProcess, hMod, procName, MAX_STR / sizeof(char));
}
}

//メモ帳が起動中かどうか確認する
if (strcmp(procName, "notepad.exe") == 0) {
//メモ帳を確認
break;
}
}

CloseHandle(hProcess);

if (i != nProc) { //iがnProcと同じ数になっているようならメモ帳は見つからなかった
printf("メモ帳が起動しています。\n");
continue;
} else {
printf("メモ帳を確認できません。終了します。\n");
break;
}
}

return 0;
} //end of main

参考URL:http://support.microsoft.com/kb/175030/ja

起動中のプロセス名の一覧を取得して、その中に「notepad.exe」(メモ帳の場合)が存在するかどうかを確認することで、監視してはどうでしょう?

試しにコードを書いてみました。
あんまりうまくは書けてないですが参考にしてみてください。
コンパイルする時には、 psapi.lib をリンクしてやる必要があります。

実行してみるとわかりますが、わりとCPUパワーを食います。
少しくらいのタイムラグが許容できるなら continue の直前に Sleep(100) とか入れるとマシになるかもしれません。


////////////

#include...続きを読む

Qシャットダウン時にコマンド実行

OS:WindowsNT

OSをシャットダウンすると同時に、とあるコマンドを
実行できないものかとツール等を検索していますが、
なかなか見つかりません。
どのような方法があるのか、ご存知の方教えてください。

Aベストアンサー

ツール的にはベクターなどで調べればあるのですが
OS自体に備わっている内部命令(API)に
確かにシャットダウン前にコマンド実行する命令は存在しておりますが、確実に動作するとは限らなかったと覚えています<サポートも積極的ではなかった覚えが・・・

時間のかかる処理や重要な処理をシャットダウン時に
行うのでしたら止めといた方がよいかと・・・

QPCをシャットダウンさせるプログラム

WindowsフォームアプリケーションでPCをシャットダウンさせるプログラムを製作中です。
プログラムソフトはVisual C++ 2008を使用しています。
フォーム上のボタンをクリックしたらシャットダウンさせるものです。
コンソール用の以下のコードをそのまま追加するとリンクエラーがでます。

int ShutDown(){
HANDLE hToken;
TOKEN_PRIVILEGES TokenPri;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) == FALSE){
return FALSE;
}
if(LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &TokenPri.Privileges[0].Luid) == FALSE){
return FALSE;
}
TokenPri.PrivilegeCount = 1;
TokenPri.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &TokenPri, 0, (PTOKEN_PRIVILEGES)NULL, 0);
if(GetLastError() != ERROR_SUCCESS){
return FALSE;
}
ExitWindowsEx(EWX_SHUTDOWN, 0);
return 0;
}

リンクエラーは、
error LNK2028: 未解決のトークン (0A00000F) "extern "C" int __stdcall ExitWindowsEx(unsigned int,unsigned long)" (?ExitWindowsEx@@$$J18YGHIK@Z) が関数 "private: int __clrcall timer_bata::Form1::ShutDown(void)" (?ShutDown@Form1@timer_bata@@$$FA$AAMHXZ) で参照されました。
他3つになります。

コンソール用のシャットダウン実行ファイルをWindowsフォームアプリケーションから外部コマンドを呼び出す形ではできたのですが、一つの実行ファイルにまとめることができません。どうしたらよろしいでしょうか。

WindowsフォームアプリケーションでPCをシャットダウンさせるプログラムを製作中です。
プログラムソフトはVisual C++ 2008を使用しています。
フォーム上のボタンをクリックしたらシャットダウンさせるものです。
コンソール用の以下のコードをそのまま追加するとリンクエラーがでます。

int ShutDown(){
HANDLE hToken;
TOKEN_PRIVILEGES TokenPri;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) == FALSE){
return FALSE;
}
if(LookupPrivilegeValue(NULL, SE_S...続きを読む

Aベストアンサー

#pragma comment(lib,"User32.lib")
#include <windows.h>
とか?

Q自動で、普通のユーザーでコマンドラインからシャットダウンできる方法

CentOS5で、root権限でなく普通のユーザーでコマンドラインからシャットダウンできる方法が知りたいです。
sudoは、ルートのパスワードを手で入れる必要があり、自動的に動作させるときに困ります。
何か良い方法はありますか?
一応、rootのパスワードは知っている条件です。
普通のユーザーがシャットダウンできるのはおかしな話ですが、よろしくおねがいします。

Aベストアンサー

ログインとログアウト(4:ログアウトとユーザーの使い分け)
http://itpro.nikkeibp.co.jp/article/COLUMN/20060306/231763/
> ユーザーのパスワードを入力しなくても実行できる方法も
>あります。それには,visudoコマンドで編集画面を開いて,
>以下のように追加します。
>jun snobird= NOPASSWD: /sbin/shutdown -h now

QVisualC++6.0でウィンドウズをシャットダウンするプログラム

環境VC++6.0
OS:ウィンドウズXP

でウィンドウズをシャットダウンするプログラムを考えています。
現在
ExitWindowsEx(EWX_FORCE, NULL);
と書いて実行しましたところ
ログオフまでできました。
マニュアルなどには上記のコードは有無を言わさずウィンドウズをシャットダウンするものだと書かれてあったのですが、ログオフまでしかできませんでした。

どなたか、ウィンドウズをシャットダウンするプログラムを教えていただけないでしょうか?
よろしくお願いいたします。

Aベストアンサー

#1です。
ソースコードのサンプルです。

void Shutdown(void)
{
  OSVERSIONINFO WinVersion;
  HANDLE hProc,hTkn;
  TOKEN_PRIVILEGES TokenP;
  WinVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx(&WinVersion);
  if (WinVersion.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) {
    hProc = GetCurrentProcess();
    if(OpenProcessToken(hProc,TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hTkn) != FALSE) {
      if(LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&TokenP.Privileges[0].Luid) != FALSE) {
        TokenP.PrivilegeCount = 1;
        TokenP.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hTkn,FALSE,&TokenP,0,NULL,0);
      }
    }
  }
  ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);
}

かなり手抜きです。例えば、
・特権が取れなかった場合もExitWindowsExを呼んでしまうので、シャットダウンせずログオフしてしまう。
・Windows95/98/Meじゃないなら特権を取ろうとするのでwindows3.1でも特権を取ろうとしてしまう
など。

うまく手抜きを修正して使用して下さい。

#1です。
ソースコードのサンプルです。

void Shutdown(void)
{
  OSVERSIONINFO WinVersion;
  HANDLE hProc,hTkn;
  TOKEN_PRIVILEGES TokenP;
  WinVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx(&WinVersion);
  if (WinVersion.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) {
    hProc = GetCurrentProcess();
    if(OpenProcessToken(hProc,TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hTkn) != FALSE) {
      if(LookupPrivilegeValue(N...続きを読む

Q指定時間後にコマンド発効後にシャットダウンするソフト

環境:windows7 64bit


指定時間後(分数)に指定したコマンドを発効後にシャットダウンを行う
フリーソフトはありませんでしょうか。

※タスクでやればいいと思いますが、ソフトがありましたらそちらで
行いたいと思い質問させていただきました。

Aベストアンサー

「終了・シャットダウン - k本的に無料ソフト・フリーソフト」
http://www.gigafree.net/system/shutdown/

「単機能ツール(Windows終了)」がお望みの機能を一番簡単に実行出来るソフトと思います。

QWINDOWS XPのシャットダウンを”U”で

WINDOWS XPのシャットダウンを”WINDOWS”+”U”+”U”でシャットダウンするプログラムを作ったのですが、スタート画面までしかいかず、うまく動きません。自動シャットダウンのプログラムのURLもご紹介受けたのですが、上記の方法でなぜできないのか知りたいです。

Aベストアンサー

「”WINDOWS”+”U”+”U”」これはキーコードを送信して行っているのでしょうか?
キーコードを送信している場合、その間隔は?

質問の内容からして、間隔を空けずに連続で送信していませんか?
「Winキー」送信後スタートメニューがアクティブにならないと次の「Uキー」を受け取らない為と思われます。

試しに、各キーの送信の間に「Sleep()」を入れてみてはいかがでしょうか?
とりあえず時間は長めに、確実に実行させるために10秒以上入れてみてはいかがでしょう。

ただし、この方法だとPCが変わるとうまくいかない可能性があります。
理由は、スタートメニューや終了のダイアログの表示のタイミングが一定とは限らないからです。

スタートメニューがアクティブになった事を検知できればいいのですがそう簡単には行かなかった記憶があります。


それよりは、素直に「ExitWindowsEx()」関数を使った方がよほど簡単だと思いますが。。。。。


人気Q&Aランキング

おすすめ情報