2010-02-25 87 views
2

當用戶按下Windows Mobile設備上的關機按鈕時,是否有一種簡單的方式來獲取通知?當然使用C#。Windows Mobile - 檢測何時按下關機按鈕

謝謝!

+0

Dupe:http://stackoverflow.com/questions/2331343/detect-and-prevent-delay-windows-mobile-power-off – 2010-02-25 20:31:51

+0

我不會說這是一個騙局。他希望得到通知,但不能阻止它。 – ctacke 2010-02-25 20:47:02

+0

我必須在這裏發泄我的挫敗感 - 現在Windows Mobile SDK的狀態是 - 可悲的。我開始後臺活動,無法關閉它 - 即使用戶按下了電源按鈕,它仍會繼續運行。另一方面,代碼應該採取行動,並停止該用戶說服後臺活動,無法執行。真棒,只是嚇人真棒... – kape123 2010-02-26 16:40:17

回答

3

當按下電源按鈕時,電源管理器將發出狀態改變的通知。您可以要求PM通過致電RequestPowerNotifications向您發送通知,您必須發送一個point-to-point messgae queue(受管版本here)的句柄以獲取通知。

對於那些不想編寫所有膠水來完成這項工作的人,所有這些在SDF的PowerManagement class中已經爲您完成了。

也要事先警告,因爲你要求通知確實而不是意味着你的應用程序會在狀態改變發生之前得到通知。舉例來說,通常情況下,應用程序不會看到通知,並且幾乎可以肯定的是,即使您確實看到它,在暫停實際發生之前您也沒有時間執行任何操作。通常,您的處理程序將在設備恢復時運行(隨後是恢復狀態的任何處理程序)。

電源管理器不會等你,它只是廣播一條消息。在關閉之前,您不能使用它來運行代碼。

+0

Hmph ...我有聲音播放,即使按下電源按鈕,仍繼續運行...所以我會嘗試將開關設置爲autoplay = false; – kape123 2010-02-25 20:58:08

+0

任何想法爲什麼我得到「當試圖使用PowerManagement類時,無法從程序集」OpenNETCF.WindowsCE「加載類型'OpenNETCF.WindowsCE.PowerManagement'? – kape123 2010-02-25 21:26:27

+0

聽起來就像你有一個程序集版本不匹配或者什麼東西 - 可能是多個不同版本的SDF二進制文件或其他東西的多個副本。 – ctacke 2010-02-25 22:04:08

0

不幸的是,在我使用的Windows CE 6設備上,在CoreDll中不存在CreateMsgQueue。還有其他建議嗎?

我唯一能想到的就是不斷檢查Environment.TickCount與設備的實時時鐘。如果時間前進但不是滴答滴答計數,那麼推測該設備正在睡覺。

不喜歡這個方案,因爲它會如果時間跳由於設備的實時時鐘出現故障被騙

+0

你能改變圖像嗎? CreateMsgQueue是一個非常非常常見的API,我很驚訝你的操作系統沒有它。我並不是說它沒有,但是圖像被剝奪的程度確實有限。我努力要麼創建一個支持隊列的新操作系統,要麼與OEM談論添加它。 – ctacke 2010-07-01 02:57:52

+0

我實際上已經放棄了這一點......它清楚地表明WM是如何破壞的;( – kape123 2010-07-02 15:59:59

1

我只是把CreateMsgQueue()進入XIP RPM二進制文件,而不需要源代碼或OEM幫幫我。您需要使用XDA論壇中的十六進制編輯器和一些工具。

<DllImport("coredll.dll", SetLastError:=True)> _ 
Public Shared Function CreateMsgQueue(ByVal lpszName As String, ByVal lpOptions As MsgQueueOptions) As IntPtr 
End Function 

還你應該創建一個簡單的驅動程序阻止斷電事件,您的駕駛員能夠撐起了節電過程中掉電設備上的事件。這樣你可以得到一個有保證的事件,你可以設置標誌並停止後臺運行過程,並存儲任何變量,然後在PowerUp事件中恢復它們,這也是WinCE設備驅動程序的標準evC++事件。真的很簡單。互聯網上有100多個演示源代碼,我已經在100多個網站上看到過。