tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルPC電源管理について
記事No15098
投稿日: 2011/01/30(Sun) 11:15
投稿者管理職
チーム課員の退社時の勤怠入力忘れ防止のためのアプリ作成を考えております。

1.開発環境
  Windows XP Professional(SP3)
  Visual Basic 6.0(SP6)
  VB暦:約3年(趣味程度です。)

2.前提/制約条件
  課員のPCに常駐させる。(スタートアップに登録しPC起動時にアプリを起動させる。)
  課員のPC負荷率を増やしたくないので、CPU/メモリの消費量は最小限にする。
  PCのOSは全てWindowsXP(SP3)とするが、Windows7への対応も検討する。

3.要求事項
  1.PCの電源OFF信号を検出し、画面にメッセージを表示させる。
    (画面に勤怠を入力したか否かを問うメッセージを表示)
  2.メッセージのOKボタンをクリックしたら、通常通りPC電源をOFFとする。
  3.メッセージのNGボタンをクリックしたら、PCの電源はOFFとせず、通常画面に戻る。
  
4.お聞きしたいこと
  ・PCからのOFF信号を検出方法(3-1項)
  ・アプリによるPC電源OFF方法(3-2項。解決済。Win32API ExitWindowsExを使用)
  ・PCの電源OFFせずに通常画面に戻る方法(3-3項)
  上記がわかれば作成できそうですが、調べるべきAPI、
  また参照できそうなHP等ありましたらご教授いただければ幸いです。

[ツリー表示へ]
タイトルRe: PC電源管理について
記事No15099
投稿日: 2011/01/30(Sun) 13:12
投稿者花ちゃん
>   1.PCの電源OFF信号を検出し、画面にメッセージを表示させる。

電源OFF信号 と シャットダウン と同じ意味として捉えていいのでしょうか?
それとも、電源オフ機能を持っているのでしょうか? それなら、シャットダウン後の
話になるので、設定はできても、検出は?

>   ・PCからのOFF信号を検出方法(3-1項)
シャット ダウン なら、Windows がシャット ダウン時に起動中のアプリに対して、
WM_QUERYENDSESSION のメッセージを送るので、それを捕まえて、AbortSystemShutdown
API 関数を使ってキャンセルができるかも?(やった事がないので未確認)

但し、メッセージを捉えるには、サブクラス化が必要となりますので、VB6.0 からは
熟知しておられないと、PC が落ちたりしますので壊したりする危険が伴います。
Windows 7 にも対応させたいなら、この際、VB2010 等の .NET 系のVBで作成される事を
お勧めします。(サブクラス化も簡単で比較的安全なので)

※ サブクラス化しなくてもできるかも知れません。チョット試してみますので
  お待ち下さい。


>   ・アプリによるPC電源OFF方法(3-2項。解決済。Win32API ExitWindowsExを使用)
 
シャットダウン と違うのでしょうか?

http://www.hanatyan.sakura.ne.jp/vbhlp/tap_winEnd.htm

[ツリー表示へ]
タイトルRe^2: PC電源管理について
記事No15100
投稿日: 2011/01/30(Sun) 14:05
投稿者花ちゃん
OS からのシャットダウンのキャンセルは先のAPI関数ではできないみたいなので。

下記でシャット ダウンができないようにして、キャンセルは、ユーザにしてもらう事に
すれば、注意喚起はできるかと思いますので試して見て下さい。

下記をEXEにして起動したまま、Windows を終了してみて下さい。

Option Explicit

Private frg As Boolean
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
   If UnloadMode = vbAppWindows Then
      If frg = False Then
         MsgBox "勤怠入力忘れです。"
         Cancel = 1
      End If
   End If
End Sub

詳細なフラグは別途設定して下さい。

[ツリー表示へ]
タイトルRe^3: PC電源管理について
記事No15103
投稿日: 2011/01/31(Mon) 12:52
投稿者管理職
花ちゃん様 早速の回答有難うございます。
ご質問について下記の通り回答いたします。

>>1.PCの電源OFF信号を検出し、画面にメッセージを表示させる。
>電源OFF信号 と シャットダウン と同じ意味として捉えていいのでしょうか?
>それとも、電源オフ機能を持っているのでしょうか? それなら、シャットダウン後の
>話になるので、設定はできても、検出は?

紛らわしい表現になってしまい申し訳ありませんでした。
電源OFF信号=シャットダウンと同じ意味になります。

>>・アプリによるPC電源OFF方法(3-2項。解決済。Win32API ExitWindowsExを使用)
>シャットダウン と違うのでしょうか?

上記ど同様で、シャットダウンと同じ意味になります。


No.15100(2011/01/30(Sun) 14:05)にアドバイス頂いたもので、
なんとか実現できそうです。完成できたら連絡いたします。
行き詰ったら質問するかもしれませんが、
そのときは宜しくお願い致します。

以上

[ツリー表示へ]
タイトルPC電源管理について【解決】
記事No15111
投稿日: 2011/02/20(Sun) 17:36
投稿者管理職
仕事の片手間で作成したので、時間がかかってしまいました。
なんとか3月からの運用に間に合いそうです。
花ちゃん様はじめ記事を参考にさせていただいた方々ありがとうございます。

何とか形になったのでソースの掲示です。
まだまだ改造が必要になりますが・・・

Private Sub Form_Load()
'起動時にプログラムをタスクトレーに表示させる。
    With objTaskTrayIcon
        .cbSize = Len(objTaskTrayIcon)
        .hwnd = Me.hwnd
        .uID = 1
        .uFlgs = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
        .uCallbackMessage = WM_MOUSEMOVE
        .hIcon = Me.Icon
    End With
    
    Call Shell_NotifyIcon(NIM_ADD, objTaskTrayIcon)
    Call cmdTaskTray_Click
  
End Sub
    
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'Windowsシャットダウン時にフォームを表示させる。

   If UnloadMode = vbAppWindows Then
      If frg = False Then
        Call Me.Show  'タスクトレーからフォームを表示させる
        Cancel = 1
      End If
   End If

End Sub

Private Sub Cmd_OK_Click()
'OKボタンをクリック=勤怠は入力済み
  'シャットダウン用プログラムを起動
  '-->従来から使用していたプログラム(サーバにPCシャットダウン時間を記録)
  Dim MyStr As String
  MyStr = App.Path & "\TestProject2.exe"
  Shell MyStr, 0  

  '自身を終了
  Unload Me
End Sub


Private Sub Cmd_NG_Click()
'NGボタンをクリック=勤怠は未入力
'タスクトレーにフォームを隠す
    Call cmdTaskTray_Click
  Msgbox "勤怠を入力してください。"
End Sub

[ツリー表示へ]