2

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

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

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

私が探しているのは、ロックされたワークステーションの背後で実行されているか、ユーザーが (スケジュールされたタスクを介して) ログアウトされているかをコマンドライン アプリから伝える方法です。基本的に、ユーザーのデスクトップが表示されずに実行されています。それがわかれば、GUI を起動しなくてもよくなり、多くの問題を防ぐことができます。

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

これが理にかなっていることを願っています。

4

3 に答える 3

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;
   }
}

「if」ステートメント内に入ると、プロセスはデスクトップ上ではなく、「別の場所」で実行されています。デスクトップから実行していないときに namebuffer の値を調べたところ、名前はあまり意味がありませんが、WinSta0 ではありません。

ドキュメントへのリンクはこちら

于 2008-09-18T13:20:22.700 に答える
1

SENS (System Event Notification Services) を使用できる場合があります。私自身は使ったことはありませんが、ログオン、ログオフ、スクリーン セーバーなどのイベントの通知を受け取るなど、希望通りの機能を提供してくれることはほぼ間違いありません。

私はそれがかなり漠然としていることを知っていますが、うまくいけば、あなたはそれを始めることができます. 簡単なグーグル検索で、とりわけこれが見つかりました:http://discoveringdotnet.alexeyev.org/2008/02/sens-events.html

于 2008-09-17T21:23:49.757 に答える
0

このアプローチを使用して、デスクトップが Windows でロックされているかどうかを検出することに成功しました。

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);
}
于 2008-09-20T04:10:17.707 に答える