2009-10-27 61 views
4

我有一個Windows服務需要在24小時剩餘的PC上運行。我可以讓我的服務保持Windows進入睡眠狀態嗎?

我不能依靠禁用睡眠/關閉的PC,因爲它在3500個站點上安裝,X,Y或Z可能意味着未關閉睡眠/關閉。

有沒有一些整潔的.NET方式,我可以防止Windows打盹?或者定期寫一個文件(比如每分鐘寫一次日期)就足夠了嗎?

請不要橫向/不良練習警告「你不應該強迫這種事情,把它留給電腦」答案。這是我的工作,以確保此程序在客戶的計算機上實現此目的!

乾杯!

編輯:

[大嘆]

像往常一樣,支線不禁評論。我試圖勸阻,以避免拼出自我辯解,但嘿。它沒有工作。人們認爲我試圖接管「他們」的電腦。

這是一個公司客戶,它監視安全硬件上的操作並記錄它。就像有人用電子鑰匙開門一樣。

由於門需要一天24小時工作,他們顯然需要每天24小時記錄。

這不是犯罪行爲。他們有很多網站希望發生這種情況。他們不能依靠那裏的員工關閉休眠/睡眠功能。所以他們要求我確保它能保持活力。

再一次,它確實不是犯罪。有時候這些事情都必須發生。

我討厭爲我在這裏問的每個問題辯護。現實世界並不像我們所希望的那樣整潔蓬鬆。

在一個更積極的方面,非常感謝那些幫助!

+3

儘管你的聲明「請不要告訴我這是不好的做法」;我覺得我必須告訴你這是一個壞主意。我控制了我的電腦,而不是我運行的軟件。建議你找到另一種方法來完成你想要做的任何事情。 – 2009-10-27 13:31:36

+4

嗯,在企業環境中,米奇,這不是你的電腦,它屬於公司,如果MGMT決定那麼我們就可以,但其實現,已經建議他們自己的頭蓋骨和他們rectums的同一地點,當然。但是,這是一個非常骯髒(嗯,無論如何,無論如何,綠色的反面)和昂貴的方法。我期望mgmt希望節省成本,並確保每臺pc只在使用時才運行,否則就會關閉。有沒有其他的方式來實現你想要的? – serialhobbyist 2009-10-27 13:35:50

+0

erm,所以他們不會在企業環境中關閉他們的PC。減少碳排放量呢?另外,我在問題的任何地方都看不到這個詞... – 2009-10-27 14:12:40

回答

3

是的,有!其他應用程序正在這樣做(請參閱Cyber​​link的Power DVD),因此API就在那裏。

我建議你開始閱讀約Windows Power Management API's。然而,你可能不得不求助於P \ Invoke,因爲我不認爲.NET爲這些API提供了託管實現。

特別是它似乎有一個功能來註冊您的服務的電源狀態更改通知:RegisterPowerSettingNotification。我假設您的服務可能會要求取消某些電源狀態更改(例如進入睡眠狀態)。

那麼你也應該看看這些Power Management Functions

而且,作爲最後的手段 - 儘管如此,您還可以讓您的服務生成並定期向系統發送按鍵以模擬用戶活動。

**注意**

給這個一些更多的思考之後,我想指出,我會採取的做法是建立在Windows的電源管理配置文件是將計算機配置爲從不去睡眠或休眠。然後,從您的應用程序/服務中,監視活動電源狀態配置文件(使用上述API),如果發生更改,則以編程方式將其更改回來。這應該是一個執行策略的非常乾淨的方式。見PowerSetActiveScheme

+1

雖然這個答案可能是什麼joshcomley需要,我真的希望這是不可能與API阻止睡眠/休眠狀態,當用戶強制它。關閉一臺筆記本電腦,把它放進包裏,幾個小時後發現電池因數據丟失而死亡是Windows XP的一件事,我希望我永遠不會再看到(迄今爲止Vista和Seven都沒有這樣做)。 – OregonGhost 2009-10-27 13:36:40

+1

那麼,我當然明白你的觀點OregonGhost,但在一個受控制的環境中,我沒有看到任何錯誤。當然,只有一個白癡會試圖阻止筆記本電腦從睡眠/睡眠,但它似乎並不像OP想要的那樣。 – 2009-10-27 13:43:44

+0

@Miky D--太血腥了。發現! DVD播放器的好例子 - 當我在觀看長時間的在線電影並且屏幕在20分鐘後關閉時,我很惱火。有時候這些功能是必需的。 – joshcomley 2009-10-27 15:00:44

3

看一看在SetThreadExecutionState API。它使您能夠通知系統,你的應用程序是活動的,以使電腦無法進入睡眠狀態

+0

不,它說「最低支持的客戶端:Windows 2000專業版」。但ES_AWAYMODE_REQUIRED標誌確實是只支持在Vista(後來) – 2009-10-27 13:51:21

+0

除非他的客戶是那些誰拒絕讓他們的機器上(比如,我的工作)Vista中的一個,我仍然認爲這是一個很好的解決方案。如果它在某些較舊的機器上無法正常工作,這很容易解釋。如果你想保留過時的系統,你應該期待更多的管理工作。任何新的應該工作。 – 2009-10-27 14:02:02

+0

這聽起來很有希望。他們使用XP盒 - 如果我沒有記錯的話,那是在Windows 2000之後! – joshcomley 2009-10-27 15:02:55

1

我們很久以前遇到過類似(但倒)的問題與我們的緊急呼叫處理系統:醒來的監視器已經去睡覺,以便其相關的整體揚聲器會播放鈴聲。我發現最好的方法是使用SendInput以編程方式將鼠標抖動一個像素,然後再返回。代碼使用帶有SendInput的MOUSEEVENTF_MOVE。這是本地代碼而不是.Net,但它應該給你一個開始尋找的地方。

相關問題