vc 写一个计算机功能,VC++的一个实例
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
VC開發實例
一、開發背景:
我想大家都有過忙手忙腳最小化窗口(或關閉窗口)的經歷吧!原因很簡單--不想讓突如其來的老板、老媽、老婆看到我們電腦屏幕上正在顯示的游戲、日記、MM:-)?等屬于個人隱私的東東。
如果能做一個程序在后臺運行,當我們發出一個特殊的輸入事件(我選擇了鼠標左、右鍵同時按下)時,該程序就迅速隱藏正在顯示的窗口,免去人工瞄準并按下每個窗口右上方的那個小得可憐的的最小化按扭之苦了。當危險解除再利用這個特殊事件使隱藏的窗口恢復。
這對于像我這樣小腦不太發達、心理素質又不過硬而又經常在老板的眼皮底下"懸崖騎馬"的同志們來說是絕對有實戰意義的。于是我做了這個"魔高一丈"以實現上述功能!
二、程序原理:
首先,我們得能截獲鼠標左、右鍵同時按下去這個事件--這并不難--設一個標志變量當鼠標發出WM_LBUTTONDOWN并且又有WM_RBUTTONDOWN消息發出時把它置"1"罷了。
而我要說明的是,這個"同時按下"只是一種宏觀上的概念,鼠標是不會同時發出兩個消息的。其次就是解決不管鼠標位于任何窗口之上都能在程序里截獲(或者稱為監聽更準確)到鼠標發出的消息并加以過濾的問題了,這是很關鍵的。我用了鉤子船長的那只鉤子(Hook),而且是全局的鼠標鉤子,它給了我們跟操作系統溝通的一個機會。
許多比較有神秘感的程序(比如金山詞霸的鼠標取詞)都是用它實現的,稍后我將詳細解釋。最后就是剩下能得到可見的窗口的句柄(HANDLE)并根據其句柄顯示、隱藏窗口的問題了,這也沒什么難的有現成的API函數--EnumWindows和ShowWindow。你可以先運行一下我的程序(那個大五星,需要把它跟那個Mousehook.dll文件放在一個文件夾下)。當鼠標左右鍵一起按下時所有的窗口都隱藏了;再一次同時按下左右鍵又可恢復隱藏窗口;單擊任務欄右下角(托盤)的圖標可隱藏或顯示本程序窗口。
三、開發步驟:
第0步、選用VC?6.0集成開發環境。
第1步、由于建立全局鉤子必須把鉤子函數放在DLL里面,所以我們選擇MFC?AppWizard(DLL)創建一個新的項目,命名為"Mousehook",再選擇選擇MFC?Extension?DLL類型(為了方便嘛!)。
為什么必須把全局鉤子函數放在DLL里呢?這是因為系統會動態地調用你所添加的全局鼠標鉤子,所有窗口消息數都會由于你添加了鼠標鉤子而引起系統處理(何為處理?調用鉤子函數也。)這必然需要操作系統能夠從一個東東里動態地加入這段處理程序,而這個東東非DLL莫屬。
第2步、在項目中加入Mousehook.h文件用以構造一個鉤子類--CMousehook,具體如下:
class?AFX_EXT_CLASS?CMousehook:public?CObject
{
public:
CMousehook();
~CMousehook();
BOOL?starthook();//封裝SetWindowsHookEx(?int?idHook,?HOOK_PROC?lpfn,?HINSTANCE?hMod,DWORD?dwThreadID)用來安裝鉤子
BOOL?stophook();?//封裝UnhookWindowsHookEx(?HHOOK?hhk?)用來卸載鉤子
VOID?SetCheck1(UINT?i);//處理對話框的選擇鉤選框1
VOID?SetCheck2(UINT?i);//處理對話框的選擇鉤選框2
VOID?SetCheck3(UINT?i);//處理對話框的選擇鉤選框3
static?BOOL?CALLBACK?EnumWindowsProc(HWND?hwnd,LPARAM?lParam);//系統回調的鉤子函數
VOID?UseForExit();//退出程序時恢復所有隱藏窗口
};
這里我想特別地提一下EnumWindowsProc函數前的CALLBACK跟static,對于CALLBACK我想給大家一個特別江湖的解釋其就是:凡是由你設計而卻由Windows系統調用的函數,統稱callback函數。這些函數都有一定的類型,以配合Windows的調用操作。--引用臺灣侯師傅的話。他還說,某些Windows?API函數會要求以callback函數(的函數地址)作為其參數之一。
我們這里用到的又比如?SetWindowsHookEx(?int?idHook,?HOOK_PROC?lpfn,?HINSTANCE?hMod,DWORD?dwThreadID)的第二個參數。這種API通常會在進行某種行為之后或滿足某種狀態的情況下調用其參數中的callback函數。
總結
以上是生活随笔為你收集整理的vc 写一个计算机功能,VC++的一个实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React系列之生命周期
- 下一篇: s3c2440移植MQTT