Windows システムロック時の画面情報 (.NET)
質問
ユーザーの PC 上のアプリケーションを更新する夜間プロセスがあり、アプリケーションを停止して再度バックアップする必要があります (そのプロセスを変更するつもりはありません)。
問題は、起動時に有効な画面を必要とする Windows AppBar を構築しているのですが、システムがロックされている場合、Screen クラスに画面が存在しないことです。したがって、視覚効果はどれも有効になっておらず、本当に醜く表示されます。
現在これを回避する唯一の方法は、ロックされた画面を検出し、スピンしてユーザーがデスクトップのロックを解除するまで待機し、その後起動を続けることです。これはユーザーのワークフローの重要な部分であり、前の晩にそのままにしておけば稼働しているはずだとユーザーは期待しているため、このままにしておくという選択肢はありません。
何か案は??表示情報がどこにも見つからないようですが、ユーザーはまだログインしているため、どこかに保存する必要があります。
Screen.AllScreens 配列の内容:
** ロック時:
Device Name : DISPLAY
Primary : True
Bits Per Pixel : 0
Bounds : {X=-1280,Y=0,Width=2560,Height=1024}
Working Area : {X=0,Y=0,Width=1280,Height=1024}
** ロック解除時:
Device Name : \\.\DISPLAY1
Primary : True
Bits Per Pixel : 32
Bounds : {X=0,Y=0,Width=1280,Height=1024}
Working Area : {X=0,Y=0,Width=1280,Height=994}
Device Name : \\.\DISPLAY2
Primary : False
Bits Per Pixel : 32
Bounds : {X=-1280,Y=0,Width=1280,Height=1024}
Working Area : {X=-1280,Y=0,Width=1280,Height=964}
解決
このためのクリーンな解決策はありませんが、Windowsは、ワークステーションがロックされていることを検出する方法を提供し、「間違った」デスクトップがアクティブになっていることはありません。あなただけのサンプルコードは<ここで、セッションのスイッチを検出することができます/ A>。この作業を行うには、あなたはかなりのアプリでこのコードを含めると、それが戻って起動したとき、それが戻って読むことができたパンくずを残す持つことを余儀なくしています。アプリは永久にはまり込むことができないように、あなたはそれを一度使用した後にそれをリセットしてください。
他のヒント
この画面ロックの問題は、使用しているバージョン (画面をロックする GINA を使用する XP と ContentProvider を使用する Vista のいずれか) によって異なります。最終的には、これら両方のメカニズムがこの問題の原因となります。
画面がロックされているかどうかを確認する唯一の方法は、スクリーンセーバーを起動することです (これは、pinvoke を実行してクエリを実行することで簡単にクエリできます) システムパラメータ情報, 、スクリーンセーバーがアクティブかどうかを確認するには - SPI_GETSCREENSAVER実行中 そして SPI_GETSCREENSAVESECURE WinKey + L を押してスクリーン セーバーを開始するときに、GINA またはコンテンツ プロバイダーをトリガーするかどうかを判断します。指定された時間が経過した後、アクティビティがなければ、GINA または ContentProvider が開始され、スクリーン セーバーがロック画面に置き換えられます。 ..Windows での安全なログ情報に関してここに投稿された 2 つの関連リンクを含めました。
これは、しかし、あなたはすべてのUSER32からEnumDisplayDevices、EnumDisplaySettingsEx、MonitorFromPoint、GetMonitorInfoを利用することができる、少し作業を必要とし、デバイスのスクリーンショットをつかむでしょう。
PCがロックされ、またはアクティブなスクリーンセーバーがある場合は、画面キャプチャは常にベージュ色でされている場合。あなたはロックされているシステムを知るために、その状態をチェックすることができます。これはまたにRDPedされているシステム上で動作します(例えばXP VDIにシンクライアント。)
少なくとも、その私の環境で動作します。コードサンプルは、グーグルで見つけることができます。