一 鍵盤
1.1 Disabling Low-level Keys
#define _WIN32_WINNT 0x0400
#include
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,
?????????? WPARAM wParam, LPARAM lParam)
{
?BOOL fEatKeystroke = FALSE;
?
?if (nCode == HC_ACTION) {
? switch (wParam) {
? case WM_KEYDOWN:?
? case WM_SYSKEYDOWN:
? case WM_KEYUP:???
? case WM_SYSKEYUP:
?? PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
?? fEatKeystroke =
??? ((p->vkCode == VK_TAB)??? &&? ((p->flags & LLKHF_ALTDOWN) != 0)) ||
??? ((p->vkCode == VK_ESCAPE) &&? ((p->flags & LLKHF_ALTDOWN) != 0)) ||
??? ((p->vkCode == VK_ESCAPE) &&? ((GetKeyState(VK_CONTROL)&0x8000) != 0))||
??? ( p->vkCode == VK_LWIN)?? ||? ( p->vkCode==VK_RWIN )
??? ;
?? break;
? }
?}
?return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam,
? lParam));
}
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int)
{
??????
??????? // Install the low-level keyboard & mouse hooks
??????? HHOOK hhkLowLevelKybd? = SetWindowsHookEx(WH_KEYBOARD_LL,
??????? LowLevelKeyboardProc, hinstExe, 0);
?
?????? // Keep this app running until we're told to stop
???????? MessageBox(NULL,
???????????? TEXT("Alt+Esc, Ctrl+Esc, Alt+Tab, LWIN and RWIN are now disabled.\n")?
????????? TEXT("Click \"Ok\" to terminate this application and re-enable these keys."),
??????????????? TEXT("Disable Low-Level Keys"),
??????????????? MB_OK);
?
???????????? UnhookWindowsHookEx(hhkLowLevelKybd);
???????????? return(0);
}
1.2 系統熱鍵
??????? 1.屏蔽:SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,0, SPIF_UPDATEINIFILE);
??????? 2.恢復:SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,false,? 0, SPIF_UPDATEINIFILE);
1.3 模擬按鍵
? 讓系統模擬一次按下WIN+D鍵?
?
?????????????? keybd_event(VK_LWIN,0,0,0);?
?????????????? keybd_event('D',0,0,0);?
?????????????? keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0);?
?????????????? keybd_event('D',0,KEYEVENTF_KEYUP,0);
1.4 切換到當前桌面
模擬最小化屏幕快捷鍵Window+D?
?
???????????????????????????? keybd_event(VK_LWIN,0,0,0);?????
???????????????????????????? keybd_event('D',0,0,0);?????
???????????????????????????? keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0);?????
???????????????????????????? keybd_event('D',0,KEYEVENTF_KEYUP,0);?
---------------------------------------------------------------?
?
正統的辦法如下:?
?
#include???
#include???
?
int? main? ()?
?????? {?
?????????????? CoInitialize? (0);?
?????????????? IShellDispatch4? *pdisp? =? NULL;?
?????????????? CoCreateInstance? (CLSID_Shell,? NULL,? CLSCTX_ALL,? __uuidof? (IShellDispatch4),? (void? **)&pdisp);?
?????????????? pdisp->ToggleDesktop? ();? //? 這句是用來切換桌面的?
?????????????? pdisp->Release? ();?
?????????????? CoUninitialize? ();?
?????? };
1.5 調出關機選擇畫面
////////調出關機選擇畫面:(重啟、關機、休眠、待機)?
typedef? int? (CALLBACK? *SHUTDOWNDLG)(int);? //顯示關機對話框函數的指針?
HINSTANCE? hInst? =? LoadLibrary("shell32.dll");? //裝入shell32.dll?
SHUTDOWNDLG? ShutDownDialog;? //指向shell32.dll庫中顯示關機對話框函數的指針?
if(hInst? !=? NULL)?
{?
?????? //獲得函數的地址并調用之?
?????? ShutDownDialog? =? (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);?
?????? (*ShutDownDialog)(0);?
}?
二 鼠標
2.1?? ::ClipCursor(&rect);
??????? ::ClipCursor(NULL);
2.2 一個未公開的API函數BlockInput,在user32.dll中,用它可以
輕易的鎖定鍵盤和鼠標。
BOOL __stdcall (*BlockInput)(BOOL Flag);
(FARPROC)BlockInput = GetProcAddress(GetModuleHandle(
??? "user32.dll"), "BlockInput");
if (BlockInput) BlockInput(TRUE); //這樣就可以了
三 顯示器
?? 3.1 關閉顯示器
??????? 1. SendMessage( WM_SYSCOMMAND, SC_MONITORPOWER, 2);//關顯示器
?????????? SendMessage( WM_SYSCOMMAND, SC_SCREENSAVE, 0);//運行屏保
??????? 2. ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);
?
??????? 3. SendMessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_MONITORPOWER,2);
?? 3.2 啟動屏保
???????? PostMessage(WM_SYSCOMMAND,SC_SCREENSAVE,0);
四 系統桌面
? 4.1 隱藏任務欄
?????? 隱藏 ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);
??????????? or ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);
?????? 顯示 ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_SHOW);
??????????? or ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_SHOW);
?? 4.2 在任務欄隱藏
?????? SetWindowLong(Application,Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
?? 4.3在任務管理器中隱藏
//定義RegisterServiceProcess函數的原型
typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
//注冊應用程序的進程
//其中i = 0,將進程注冊成非服務進程,這樣,在Windows的關閉程序窗口中就不會出現應用程序
//的名稱了。
// i = 1,將進程注冊成服務進程,這是一般應用程序運行時所采用的狀態。
void RegisterProcess(int i)
{
??????????? HINSTANCE hDLL;
??????????? LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
??????????? //加載RegisterServiceProcess函數所在的鏈接庫
??????????? hDLL = LoadLibrary("KERNEL32");
??????????? //得到RegisterServiceProcess函數的地址
??????????? lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL, "RegisterServiceProcess");
??????????? //執行RegisterServiceProcess函數
??????????? lpRegisterServiceProcess(GetCurrentProcessId(),i);
?????????? //卸載鏈接庫
?????????? FreeLibrary(hDLL);
}
?
4.4啟動屏保
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"C:\\*.BMP",WM_WININICHANGE);