サービスは、ユーザーのデスクトップとは別のセッション、悪名高いセッション0で実行されます。シャッター攻撃の慢性的な問題のため、Vista以降は分離されています。詳細については、「セッション0の分離」をグーグルで検索してください。
セッション0にはまだデスクトップがあり、それに切り替えることはできません。nullのMainWindowHandleを取得するための最も一般的な診断は、プロセスがそれを作成できるようになるのに十分な時間待機していません。少なくともProcess.WaitForInputIdle()が必要です。
それは正確に解決策を約束するものではありません、あなたはまだプログラムが誤動作していることを検出する非常に深刻な問題を抱えています。または、MainWindowHandleは実際にはスプラッシュ画面のハンドルであり、メインウィンドウではないため、スプラッシュ画面が閉じられたためnullになります。または、別のユーザーアカウントや一般的でない作業ディレクトリでは正しく機能しないため、プログラムが急いでいたこと。その他、サービスとして実行する前に、まずコンソールモードプログラムでこれを機能させることによって整理する必要があるもの。
この時点で、コンソールモードのアプリを維持するのがおそらく最善です。障害は完全に診断できないため、ITスタッフから電話がかかってきたときに、障害が機能しなくなり、何も見ることができないため、これは後部で常に苦痛になります。