0

I am attempting to show a form from a service on Vista (using .NET winforms)

Obviously the form would not show to the console user, as services are isolated in session 0.

However the experiment is to see if it is possible to "show" an invisible form and obtain a window handle & message loop

I have tried but when I issue form.Show(), only the form.Load event fires not .Shown or .FormClosing

Is there any way to capture windows messages in this way as a user application would?

I have not attempted to make the service 'interactive' as I do not wish to interact with the logged-on user.

4

1 に答える 1

0

はい、サービスのデスクトップにフォームを表示できます。ログインしているユーザーには表示されません。実際、Vista 以降の OS では、サービスを「インタラクティブ」に設定しても、ユーザーに表示することはできません。デスクトップは対話型ではないため、フォームが受け取る Windows メッセージはわずかに異なりますが、大部分のイベントは、対話型デスクトップの場合と同じようにサービスでトリガーされるはずです (簡単なテストを行ってフォームを取得したところです)。読み込み、表示、アクティブ化、および終了イベント)。

覚えておくべきことの 1 つは、フォームを表示するには、スレッドが STA スレッドである必要があり、ShowDialog または Applicaton.Run を呼び出してメッセージ ループを作成する必要があることです。また、フォームとのすべての外部対話は、フォーム インスタンスで Invoke または BeginInvoke を使用して正しいスレッドにマーシャリングする必要があることに注意してください。

これは確かに非常に実行可能ですが、実際にはまったくお勧めできません。どのような状況でも、フォームとフォームに含まれるすべてのコンポーネントで、メッセージ ボックスなどの予期しない UI が表示されないようにする必要があります。この方法が実際に正当化されるのは、適切に機能するためにハンドルの作成が必要な疑わしい品質のレガシー ツールまたはサード パーティ ツールを使用している場合のみです。

于 2009-10-29T18:49:35.140 に答える