阻止系統自動睡眠的小軟體,附C 製作過程

2022-02-12 14:55:21 字數 3336 閱讀 8273

增加了合上蓋子時保持喚醒功能,截圖懶得換了。

第一張是主介面,最小化時會隱藏視窗。後面的是托盤的選單,托盤會根據不同的設定選擇不同的圖示。

其中,開啟離開模式不需要修改登錄檔,自然的,也就在軟體開著的時候有效。監控模式則是每隔半分鐘,就將本次設定告知系統。為啥需要這個選項呢?往後看看實現就知道了。(嗯,發現其實不用這個選項的)

程式在最後面。

下面是實現(其實寫這個程式的目的之一就是為了學習c#……):

(所謂的)核心**是呼叫這個api ( msdn的介紹) :

execution_state winapi setthreadexecutionstate(

_in_ execution_state esflags

);

這個api作用是允許程式通知系統在使用某些資源,以阻止系統進入睡眠或關閉顯示器。

引數esflags是以下選項的組合:es_awaymode_requiredes_continuouses_display_requiredes_system_required

按字面意思理解選項即可。其中es_continuous表示在下一次呼叫該api前,本次設定會一直生效。所以在大部分情況下,加上這個選項的話,只需呼叫一次api即可。但考慮到可能有別的程式也在呼叫這個api,因而讓本程式的設定失效,所以有了監控模式:每隔一斷時間就將設定通知系統。(這個api是針對每個執行緒而言的,只要這個執行緒不退出,和continuous一起設定的選項就會一直生效)。

若是單獨使用es_continuous選項,則會恢復睡眠策略。

c# 怎麼使用win32api呢?

using system.runtime.interopservices;

// 按照api原型,將型別轉換c#的型別宣告即可

[dllimport("kernel32.dll")]

static extern uint setthreadexecutionstate(uint esflags);

// 選項所用到的常數

const uint es_awaymode_required = 0x00000040;

const uint es_continuous = 0x80000000;

const uint es_display_required = 0x00000002;

const uint es_system_required = 0x00000001;

c#所有的方法變數都必須宣告在乙個類裡。我把這些東西宣告到乙個叫public的類。宣告後,就可以直接呼叫該方法了。

(不知道起什麼子標題……)

該程式可以通過主介面以及托盤彈出的選單進行選擇的設定,所以需要同步這兩個地方的狀態,checkbox該自動打鉤時打鉤,該取消時取消等等。為了寫**時,不需要考慮這些東西,就抽象出了乙個option類(每次起名的時候就痛恨自己英文太差)。通過該類可以設定選項,同時也可以在裡面註冊乙個委託,當選項有變時,會呼叫這些委託。同時,該類也會負責在設定選項時自動通知系統。注:在析構函式中,以引數es_continuous呼叫一次該api恢復原來的休眠配置。

主介面:

主介面就是拉拉控制項,處理下事件。注意,checkbox的選項值可能會因為滑鼠點選以外的原因改變,所以選擇監聽滑鼠點選事件。為了處理事件時少貼上點**,我用乙個dictionary將每個checkbox和乙個選項值繫結在一起。然後使用同乙個事件處理函式,在函式裡,根據sender確定是哪個checkbox傳送的,再根據那個dictionary確定需要設定什麼樣的值。 然後向option類註冊乙個委託,在選項有變時改變checkbox到正確的狀態。

最小化時直接隱藏視窗,而不是縮小的工作列:可以選擇監聽resize事件,在事件中判斷窗體是不是處於最小化的狀態,是的話就隱藏窗體。更徹底的是過載窗體類的訊息處理函式,並自己處理最小化訊息。

protected override void wndproc(ref message m)

} base.wndproc(ref m);

}

托盤部分:托盤:使用notifyicon控制項。注意,這個控制項必須設定icon才能顯示。新增乙個contextmenustrip物件作為右鍵點選時的彈出選單。為了讓點選托盤時能彈出這個選單,可以將托盤控制項的contextmenustrip屬性設定為該選單即可。在這裡因為我需要監聽滑鼠事件,讓左鍵點選時顯示主視窗,我就在事件處理函式中順便處理右鍵點選了。如果是右鍵點選,則呼叫該選單的show方法就可以了。

然後是選單的內容。新建若干toolstripmenuitem物件,並用contextmenustrip.items.add(…)方法將這些item新增進選單即可。每個item可以監聽滑鼠點選事件,同時也可以通過設定它的checked屬性來顯示item文字前的小鉤鉤。需要分割線的話新增toolstripseparator物件就可以了。

動態的托盤圖示:為了少寫點什麼讀取檔案之類的**,就直接把托盤圖示新增程序式的資源檔案裡了。方法是在專案的屬性裡選擇資源,然後就可以新增想要的資源了。需要訪問這些資源時,在myproject.properties.resources裡就可以訪問了。如:system.drawing.bitmap bitmap1 = myproject.properties.resources.image01(參考msdn)。最後再根據選項的狀態選擇相應的圖示即可。

生成的exe的圖示:在專案的屬性裡,選擇應用程式選項卡,就可以設定圖示了。

睡眠終結者:

Ubuntu系統自動睡眠後無法喚醒

解決辦法 安裝laptop mode tools工具包,啟動laptop mode模式。檢查是否已經安裝了該工具包 ctrl alt t開啟命令端視窗 輸入命令 dpkg l grep laptop mode tools 如果執行命令無結果輸出,表示未安裝,如果已經安裝輸出結果如下圖所示,然後跳轉至...

mac系統終端命令列設定自動關機 重啟 睡眠

mac設定定時關機 重啟 睡眠,可以用終端命令來解決 命令的主體主要是 shutdown,h r s 分別代表關機 重啟 睡眠,然後在後面加上執行時間 yymmddhhmm 即可。1.設定2013年11月4日14 10分關機 sudo shutdown h 1311041410也可以 sudo sh...

vue使用enter鍵阻止自動提交表單的解決方法

問題 專案中使用了element ui,在某乙個input上繫結了enter的鍵盤事件,如下 true value keyup.native.enter search el input search i el form item el form 理論上來說按下回車鍵會提交查詢,然後獲取查詢結果渲染到...