1

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

そのスプラッシュ スクリーンは、有効なコードが入力されると、それをサービスに通知し、サービスは x 時間 (コードによって異なります) スリープ状態になります。

スプラッシュ スクリーンは単純に終了します。サービスが起動すると、スプラッシュがなくなっていることがわかり、起動します。

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

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


アップデート:

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

設定によって動作を変更できます: win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0) これはレジストリ値を一時的に設定するのと同じです: HKEY_CURRENT_USER\Control Panel\Desktop\ForegroundLockTimeout起動するアプリでそれを作成するか、起動するアプリの起動ヘルパーを構築します。

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

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

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

サービスからデスクトップにアプリケーションを起動する方法を知りたい人は、コードへのリンクを参照してください

4

2 に答える 2

0

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

元の意図は、8 文字のコードを入力すると、定義されたパス コードの期間スプラッシュ スクリーンを閉じる、スプラッシュ スクリーンのようなパス コードによってキオスクのようなアプリケーションを妨害することです。実際に使用するアプリケーションは、もともと autostart フォルダーによって起動されていました。

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

于 2009-05-21T09:44:09.150 に答える