ログインしている各ユーザーに対して特定のアプリケーションが実行されているかどうかを確認する「SYSTEM」アカウントで実行されている Windows サービスがあります。アプリケーションが実行されていない場合、サービスは (対応するユーザー名で) アプリケーションを開始します。
CreateProcessAsUser() を使用して目標を達成しようとしています。サービスは対応するユーザー名でアプリケーションを起動しますが、GUI は描画されません。(はい、「デスクトップとの対話をサービスに許可する」チェックボックスが有効になっていることを確認しています)。
システム: XP SP3、言語: C#
興味深いかもしれないいくつかのコードを次に示します。
PROCESS_INFORMATION processInfo = new PROCESS_INFORMATION();
startInfo.cb = Marshal.SizeOf(startInfo);
startInfo.lpDesktop = "winsta0\\default";
bResult = Win32.CreateProcessAsUser(hToken, null, strCommand, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startInfo, out processInfo);
私の知る限り、設定 startInfo.lpDesktop = "winsta0\default"; 対応するユーザーのデスクトップを使用する必要がありました。
ここに記載されていることとは反対に: http://support.microsoft.com/kb/165194、lpDesktop を null に設定するか、まったく設定しないで試してみましたが、どちらも同じ結果になりました: プロセスは期待される名前で開始されましたユーザーと私は、ウィンドウのタイトル バーの一部を見ることができました。「見えない」ウィンドウは、マウス クリック イベントをインターセプトし、期待どおりに処理します。それ自体を描画しません。
そのような問題に精通していて、私が間違っていることを知っている人はいますか?