6

ソケット接続などを制御するWindowsサービスとして実行されるac#アプリケーションがあります。また、このサービスを制御および構成するための別のWindowsフォームアプリケーションがあります(開始、停止、構成パラメーターを使用したフォームの表示)。

.netリモーティングを使用してIPCを実行していますが、それは問題ありませんでしたが、実際のトラフィックやその他のレポートを表示したいのですが、リモーティングはパフォーマンス要件を満たしていません。したがって、両方のアプリケーションを1つにまとめたいと思います。

ここに問題があります:

Windowsサービスからフォームを開始したとき、何も起こりませんでした。グーグルで検索すると、サービスを右クリックし、[ログオン]に移動して、[サービスにデスクトップとの対話を許可する]オプションをオンにする必要があることがわかりました。ユーザーにそうするように依頼したくないので、インストール時にユーザーのregeditでこのオプションを設定するために、コードを再度グーグルで検索しました。問題は、このオプションを設定しても機能しないことです。サービスのログオンオプションを開き(チェックされています)、チェックを外してもう一度チェックする必要があります。

それで、それをどのように解決するのですか?同じプロセスでsystrayコントロールを備えたWindowsサービスを使用して、ログインしているすべてのユーザーが利用できるようにするための最良の方法はどのようになっていますか?

更新:これまでのコメントに感謝します、みんな。私はIPCを使用する方が良いことに同意し、Windowsサービスとユーザーインターフェイスを混在させるのは悪いことだと知っています。とはいえ、その方法を知りたいです。

4

8 に答える 8

19

選択したテクノロジーを使用して通信する2つの別個のプロセス。UIを使用したサービスは悪い考えです。この道を下ってはいけません-あなたはそれを後悔するでしょう。

単純なソケット接続を介したサービス通信で非常に良い結果が得られました。サービスプロトコルを適切に文書化し、可能な限り単純に保つと、思ったよりも簡単になります。

于 2008-10-01T18:40:03.863 に答える
1

実際には、サービスを管理UIと結合しないでください。

于 2008-10-01T18:41:24.063 に答える
1

グレッグに同意します。おそらく、別のIPCメカニズムを調べることができます。おそらく、ソケットと独自のプロトコルを使用します。または、サービス制御アプリがローカルマシン上のサービスのみを制御できる場合は、名前付きパイプを使用できます(さらに高速です)。

于 2008-10-01T18:41:37.840 に答える
1

この記事からこれを行う方法を理解しました(メソッドテーブルの[変更]リンクをクリックします)。

string wmiPath = "Win32_Service.Name='" + SERVICE_NAME + "'";
using (ManagementObject service = new ManagementObject(wmiPath))
{
    object[] parameters = new object[11];
    parameters[5] = true;  // Enable desktop interaction
    service.InvokeMethod("Change", parameters);
}
于 2009-11-24T15:02:14.007 に答える
1

サービスとフォームを混同する方法は次のとおりです

http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx

于 2009-07-23T12:51:50.433 に答える
1

私はいくつかのステップで解決策を持っています。これが計画です

  1. Windows フォームを使用してサービス プロジェクトを作成するのではなく、Windows サービス プロジェクト、Windows フォーム プロジェクト、およびセットアップ プロジェクトを含む Visual Studio ソリューションを作成します。

  2. アイデアは、Windows サービスが常に実行するために使用するパラメーターを格納するデータを格納するのに慣れているデータベースまたはファイルまたは何かを用意することです。そのため、Windows サービスと Windows フォーム アプリケーションは、そこからデータを変更および取得できる必要があります。

  3. Windows アプリケーションのメイン フォームに NotifyIcon をフォームにドラッグ アンド ドロップし、[プロパティ] タブで .ico 画像を参照して選択します (Visual Studio で作成できますが、これは別のトピックであり、Google で取得したり、私に連絡したりできます)アプリケーションを実行し、メインフォームがアクティブまたは表示されているときにシステムトレイに表示されることを確認して、アプリケーションを実行してください。

  4. ソリューションのセットアップ プロジェクトで、両方を出力として追加します。プロジェクトをセットアップ プロジェクトに追加するには、それらが同じソリューション内にある必要があります。ソリューション エクスプローラーでセットアップ プロジェクトを右クリックし、追加を強調表示してからプロジェクト出力を選択し、Windows サービスと Windows フォーム出力を追加すると、セットアップ プロジェクトの下のソリューション エクスプローラーに表示されます。

  5. Windowsサービスの追加はこれよりも先に進みますが、それも別のトピックです google it

  6. Windows アプリケーションのショートカットを作成し、それをスタートアップ フォルダーに追加することも、Google または連絡先の別のトピックです。

    注 閉じるボタンが表示されず、フォームが Me.visible = false になるようにフォームをプログラムし、システム トレイのアイコンをダブルクリックすることが me.visible=true. を設定する唯一の方法です。コンピューターが起動すると、Windows フォーム アプリケーションも起動され、visible はすぐに false に設定されますが、アイコン イメージの通知アイコンがあるため、システム トレイに表示され、ダブルクリックするとフォームが表示され、設定を編集できます。サービス用に保存している場合、セットアップ プロジェクトでサービスをセットアップする際に設定したので、サービスも自動的に開始されます。私のメールはiamjavademon@gmail.comで、スクリーンショットを使用したより良い説明と完全な説明を求めています

于 2010-03-18T21:19:44.320 に答える
0

対話型サービスの主な問題は次のとおりです。

  • セキュリティ - 他のプロセスがそのメッセージ ポンプを介してメッセージを送信し、それによって SYSTEM/LOCAL プロセスにアクセスできます。

  • 不完全性 - 対話型サービスはシェル メッセージを表示しないため、通知領域のアイコンと対話できません。

私たちは定期的に TCP および UDP 接続を使用して、サービスから他の exe、場合によっては MSMQ に情報を渡します。

于 2009-01-08T03:02:22.833 に答える
0

それは非常に簡単です - アプリケーション イベントを実行するために 1 つのスレッドを作成する必要があります。このように(CLRを使用したC++のソースコードですが、C#でこれを作成できます):

ref class RunWindow{
public:
    static void MakeWindow(Object^ data)
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        Application::Run(gcnew TMainForm());
    };
};

そして、メインにスレッドを作成します

int main(array<System::String ^> ^args)
{
    bool bService = RunAsService(L"SimpleServiceWithIconInTrayAndWindow");

    if (bService)
    {

        System::Threading::Thread ^thread = gcnew System::Threading::Thread(gcnew ParameterizedThreadStart(RunWindow::MakeWindow));
        thread->Start();

        ServiceBase::Run(gcnew simpleWinService());
        Application::Exit();
    }
    else
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        // Create the main window and run it
        Application::Run(gcnew TMainForm());
    }

    return 0;
}
于 2008-10-21T12:49:43.307 に答える