服務程式的隱藏與啟用
服務程式除了被啟用後同使用者的互動,絕大部分時間都是在後台隱藏執行的,不僅介面是不可視的,而且在任務列表中也不應當出現。關於介面的隱藏比較簡單,可以通過向showwindow()函式設定sw_hide引數來實現,而在任務列表中的隱身則一般的做法是通過呼叫系統核心kernel32.dll的registerserviceprocess()函式將其設定成為乙個服務程序,這樣,在任務列表中也實現了隱身。但是registerserviceprocess()函式並非乙個標準的api函式,使用起來有點煩瑣。首先要通過 getmodulehandle()函式得到kernel32.dll模組的控制代碼,並由此通過getprocaddress()函式進一步得出 registerserviceprocess()函式在kernel32.dll中的入口位址,最後才能使用 registerserviceprocess()函式。該函式原型宣告如下:
以下是引用片段:
dword registerserviceprocess(dword dwprocessid,dword dwtype);
其第乙個引數指定了將要註冊為服務程序的程序標識,引數dwtype指定是去註冊乙個服務程序(為1時)還是去解除安裝乙個服務程序(為0時)。其具體服務註冊過程如下:
typedef dword (winapi *rsp)(dword dwprocessid,dword dwtype);
// 獲取kernel32.dll模組控制代碼
hmodule m_hkernel = ::getmodulehandle("kernel32.dll");
// 得到registerserviceprocess()函式入口位址
rsp m_rsp = (rsp)::getprocaddress(m_hkernel, "registerserviceprocess");
// 註冊當前程序為服務程序
m_rsp(::getcurrentprocessid(),1);
服務程式的隱藏與啟用
服務程式除了被啟用後同使用者的互動,絕大部分時間都是在後台隱藏執行的,不僅介面是不可視的,而且在任務列表中也不應當出現。關於介面的隱藏比較簡單,可以通過向showwindow()函式設定sw_hide引數來實現,而在任務列表中的隱身則一般的做法是通過呼叫系統核心kernel32.dll的registerserviceprocess()函式將其設定成為乙個服務程序,這樣,在任務列表中也實現了隱身。但是registerserviceprocess()函式並非乙個標準的api函式,使用起來有點煩瑣。首先要通過 getmodulehandle()函式得到kernel32.dll模組的控制代碼,並由此通過getprocaddress()函式進一步得出 registerserviceprocess()函式在kernel32.dll中的入口位址,最後才能使用 registerserviceprocess()函式。該函式原型宣告如下:
以下是引用片段:
dword registerserviceprocess(dword dwprocessid,dword dwtype);
其第乙個引數指定了將要註冊為服務程序的程序標識,引數dwtype指定是去註冊乙個服務程序(為1時)還是去解除安裝乙個服務程序(為0時)。其具體服務註冊過程如下:
typedef dword (winapi *rsp)(dword dwprocessid,dword dwtype);
// 獲取kernel32.dll模組控制代碼
hmodule m_hkernel = ::getmodulehandle("kernel32.dll");
// 得到registerserviceprocess()函式入口位址
rsp m_rsp = (rsp)::getprocaddress(m_hkernel, "registerserviceprocess");
// 註冊當前程序為服務程序
m_rsp(::getcurrentprocessid(),1);
在服務程式後台執行期間,一旦有系統熱鍵alt+ctrl+r按下,將發出系統熱鍵訊息wm_hotkey,該訊息的訊息響應函式不能通過 classwizard來新增,而只能手工完成訊息對映。在訊息響應函式中,通過對訊息引數 wparam的判斷可以確定出是否是本服務程式所設定的系統熱鍵,如果是,通過showwindow(sw_show)將程式介面顯示出來,以進行同使用者的互動操作:
以下是引用片段:
void cservicedlg::onhotkey(wparam wparam, lparam lparam) }
系統熱鍵的解除安裝
由於前面將系統熱鍵、全域性原子等都註冊到系統,因此必須在服務程式退出之前將其解除安裝,否則將導致下次註冊時的失敗。函式unregisterhotkey()負責完成對系統熱鍵的釋放,globaldeleteatom()將全域性原子從全域性原子列表刪除。
小結通過本文所述方法為後台執行的系統服務程式新增此熱鍵撥出功能可以真正實現程式的後台隱蔽執行、熱鍵啟用,非常有利於管理員和使用者的管理與使用。本文所述程式在windows 2000 professional下,由microsoft visual c++ 6.0編譯通過。
實現熱鍵啟用後台程序
在dos下編寫常駐記憶體的應用 tsr 程式時,一般設定了熱鍵啟用方式,dos使用者對 此非常熟悉。在windows 9x環境下,有的時侯前台執行程式隱藏了windows的工作列,使 使用者不能切換,許多game程式執行時便是如此。如果在你的後台程序中加入熱鍵撥出功 能,便無此慮了。程式實現原理 首...
vc 實現控制USB裝置啟用與否
include include include include pragma comment lib,setupapi.lib pragma comment lib,shlwapi.lib hdevinfo hdevinfo null 出錯資訊 void formatmsg dworddwerror...
VC實現光碟機 軟碟機 USB的禁用和啟用
由於工作的實際需要,需要對光碟機,軟碟機,usb的啟用和禁用實現控制。參考大家提供的對網絡卡禁用的 實現了光碟機,軟碟機,usb的啟用和禁用。主要實現 如下 必要的標頭檔案和要鏈結的lib檔案 include include pragma comment lib,setupapi.lib pragm...