2008-09-17 22 views
2

スタジオのさまざまな開発者が使用する一連のツールの一部であるいくつかのアプリケーションがあります。これらのアプリケーションは、主にDOS cmdシェルを開くコマンドラインアプリです。これらのアプリケーションは、コマンドラインアプリケーションの出力とステータス(ソケット経由)を追跡するGUIアプリケーションを起動します。Windowsアプリケーションの動作状態のテスト

コマンドラインアプリは、ワークステーションがロックされている(バッチファイルを起動して直ちにワークステーションをロックする)ログインしたとき、および(スケジュールされたタスクを介して)ログアウトしたときに、 。私が持っている問題は、最後の2つの場合です。

ユーザーがロックまたはログアウトしたときにこれらのアプリが起動した場合、これらのコマンドは出力/ステータスを追跡するGUIウィンドウを生成します。それは問題ありませんが、ユーザーがワークステーションをロックしているとします。ワークステーションのロックを解除すると、GUIは表示されません。タスクリストを実行していますが、表示されません。これらのユーザーが次回のコマンドラインアプリケーションを実行すると、GUIは起動していません(既に実行されているため)。デスクトップ上に表示されないため、ユーザーは出力が表示されません。

私が探しているのは、ロックされたワークステーションの背後で実行されているか、ユーザーが(スケジュールされたタスクを介して)ログアウトしているかをコマンドラインから知る方法です。可視。私がそれを伝えることができれば、私は単にGUIを立ち上げることができず、多くの問題を防ぐことができます。

私がテストする必要があるこれらのアプリケーションは、C/C++ Windowsアプリケーションです。

私はこれが意味をなされることを望みます。

答えて

3

私が探していたプログラム的な回答が見つかりました。それは駅と関係がある。明らかに、デスクトップ上で実行されているものは、特定の名前のステーションで実行されます。デスクトップにないもの(ログオフ時またはロックされたワークステーション上でタスクマネージャによって開始されたプロセス)は、別のステーション名で開始されます。コード例:もしあなたが 'ステートメント内部に入った場合

HWINSTA dHandle = GetProcessWindowStation(); 
if (GetUserObjectInformation(dHandle, UOI_NAME, nameBuffer, bufferLen, &lenNeeded)) { 
    if (stricmp(nameBuffer, "winsta0")) { 
     // when we get here, we are not running on the real desktop 
     return false; 
    } 
} 

、その後、あなたのプロセスは、デスクトップ上ではなく、「どこかに」実行します。私は、デスクトップから実行していないときに名前バッファ値を調べました。名前はあまり意味はありませんが、WinSta0ではありません。

ドキュメントhereへのリンク。私は成功したデスクトップは、Windows上でロックされているかどうかを検出するために、このアプローチを使用している

1

SENS(システムイベント通知サービス)を使用することができます。私はそれを自分で使ったことはありませんが、あなたが望むことをやることはほぼ確実です。ログオン、ログオフ、スクリーンセーバーなどのイベントを通知してください。

かなり曖昧ですが、うまくいけばあなたを始めましょう。すばやくGoogle検索でこれを見つけました:http://discoveringdotnet.alexeyev.org/2008/02/sens-events.html

0

:レイモンド・チェン

bool isDesktopLocked = false; 
HDESK inputDesktop = OpenInputDesktop(0, FALSE, 
      DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | 
      DESKTOP_ENUMERATE | DESKTOP_SWITCHDESKTOP | 
      DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | 
      DESKTOP_WRITE); 

if (NULL == inputDesktop) 
{ 
    isDesktopLocked = true; 
} 
else 
{ 
    CloseDesktop(inputDesktop); 
} 
関連する問題