LocalSystem サービス (CreateProcessAsUser 経由) から生成された GUI アプリにはフォーカスがありません

StackOverflow https://stackoverflow.com/questions/860428

質問

特定のユーザー(キオスクユーザー)がログインしている場合にのみ、特定のユーザーのデスクトップに一種のスプラッシュ画面を表示するサービスを作成しました。

そのスプラッシュ画面は、有効なコードを入力すると、それをサービスに伝え、サービスは x 時間 (コードに応じて) スリープ状態になります。

スプラッシュ画面は単に終了します。サービスが起動すると、スプラッシュがなくなっていることが確認されるので、サービスを起動します。

これはすべて機能していますが、唯一の問題は、起動したアプリケーションにフォーカスがないことです。メモ帳で作業していて時間が過ぎると、メモ帳の後ろにスプラッシュ画面が (全画面表示されますが) 表示されます。

Windows Vista についてのみ心配する必要があります。win32 拡張機能を使用して Python でコーディングしていますが、この問題は LocalSystem アカウントから呼び出されたときの CreateProcessAsUser にあると思います。


アップデート:

「問題」は実際には、私のような「イライラする」アプリケーションがフォーカスを盗むのを防ぐための意図的な制限です。

以下を設定することで動作を変更できます。win32gui.systemparametersinfo(win32con.spi_setforegroundlocktimeout、0、0)は、レジストリ値を一時的に設定するのと同等です。HKEY_CURRENT_USER CONTROL PANEL DESKTOP FOREGRANDLOCKTIMEOUTこれはユーザー自体として実行する必要があるため、起動中のアプリでビルドするか、起動するアプリの起動ヘルパーを作成します。

ただし、アプリケーションは、今は覚えていない API 呼び出しを使用してフォーカスが盗まれるのを防ぎたい場合があります。

おそらく良い解決策は、そのユーザーから現在すべてのウィンドウ ハンドルを検索し、これらの各ハンドルを使用して win32gui.ShowWindow(handle, command) を使用して最小化することです。

ただし、この特定の問題の場合は、locktimeout 設定で十分でした。

どうやってサービスからデスクトップにアプリケーションを起動できたのか疑問に思っている人がいるなら、ここに説明があります。 コードへのリンク.

役に立ちましたか?

解決 2

さまざまな非常に正当な理由により、Microsoft はサービスがアプリを起動してフォーカスを盗むことを望んでいませんが、それでも私が望むことを達成する次の回避策を見つけました。

本来の目的は、キオスクのようなアプリケーションがスプラッシュ スクリーンのようなパス コードによって妨げられるようにすることであり、8 文字のコードを入力すると、定義されたパス コードにある一定期間スプラッシュ スクリーンが閉じられます。元々、使用する実際のアプリケーションは autostart フォルダーによって起動されました。

ただし、サービスから起動されるように書き直しました。この方法では、プログラムを非表示にしてスプラッシュ画面を起動するだけのサービスからヘルパーアプリケーションを起動することで、アプリケーションを非表示にすることができます。スプラッシュ画面を終了すると、プログラムは元の画面に戻ります。以前の状態。

他のヒント

あなたはそれがフォーカスを取得したかどうかを確認するために、サービスから自分以外の別のプロセスを起動しようとしたことがありますか?メモ帳などのそれは、ブラウザからフォーカスを盗むかどうかを確認?もしそうなら、おそらくそのそれは起動時にフォーカスを取り戻すことができますプログラムます。

私はそれ以外の場合は、STARTUPINFOからwShowWindow属性はそのそれを制御する必要があるにlpStartupInfoポイントをストラクトだbeilive。またnShowWindowを使用するようにdwFlagsパラメータでSTARTF_USESHOWWINDOWを必要としています。値は、あなたが他の試してみたい場合、私は、彼らはのShowWindow機能のためにリストされていると思うSW_SHOWする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top