2010-05-17 55 views
1

我發現代碼在網上的這個漂亮的片段不起作用:使程序從c#代碼啓動時運行。設置註冊表運行爲「真」以及

rkApp = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 

,哪個跑得不錯,但可惜在Windows 7和Vista,我懷疑,它崩潰的原因它不」沒有權限寫在那裏。

於是我研究(上當然計算器)如何避免這種情況,最快的方法:

rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 

夠簡單了!雖然還有兩個問題。一個是兩種方法(在一個XP Box上),程序認爲它的相對路徑是在C:\ windows文件夾中的某個地方...所以即,它不會找到我的路徑相對幫助文件等。第二個問題是,在Windows 7上,我的程序不會啓動,直到我登錄。我希望它在任何人登錄之前在後臺啓動。

它的一個簡單的.exe,掛在系統運行時。我不想創建這個安裝程序的怪胎來解決這些管理和路徑問題。

我想我將不得不創建它作爲服務(不知道如何做到這一點),讓它啓動時,機器重新啓動之前,任何人登錄。其次要做到這一點,我相信我必須弄清楚管理員權限,並且由於我不想在每次啓動時都要批准該程序運行,這聽起來像我在安裝時必須弄清楚其管理權限,但是沒有安裝程序。

所以,只是好奇我可能採取什麼路線來實現這個目標。我甚至可以忍受它在用戶登錄後纔會出現,但我目前使用這種方式工作的方法真的使我的程序無法正常工作,因爲它試圖將東西寫出到一個新目錄中(而不是我最初開始的那個目錄EXE)。等等...我不知道如何去解決這個問題。

+1

在有人登錄之前沒有系統托盤。 – SLaks 2010-05-17 15:59:11

回答

1

如果您希望程序在任何人登錄之前作爲服務啓動,那麼需要安裝並以管理員用戶身份運行。沒有得到這個事實。

有一個Microsoft Knowledge Base article創建一個服務,應該讓你開始。

有一個在Visual Studio 2008中默認安裝的Windows服務項目模板:

「文件>新建>項目>的Visual C#>窗口> Windows服務」

+0

謝謝,我可能會對此進行重新設計。此時我不在乎它是否在登錄前在啓動時運行,但是路徑問題真的讓我很煩惱。 – Codejoy 2010-05-17 16:31:03

2

這聽起來像你需要兩個節目在這裏。

您不能在系統托盤中運行應用程序並在登錄之前運行應用程序。直到用戶登錄並具有有效的桌面後,系統托盤纔會「存在」。

處理此問題的正常方法是製作兩個程序。首先,創建一個完成大部分工作的Windows服務。這將在啓動時運行,並且獨立於任何用戶登錄。

然後,製作一個使用IPC與服務進行通信的用戶模式應用程序。這可以在登錄時運行,並遠程「與服務對話」,從而提供系統托盤要求。

+0

謝謝,我也認爲我通過確保所有路徑都使用調用Application.StartupPath來測試這個理論來破解路徑問題...... – Codejoy 2010-05-18 16:12:00