?? shutwm.cpp
字號:
// ShutWm.cpp : 定義應用程序的入口點。
//
#include "stdafx.h"
#include "ShutWm.h"
#include <windows.h>
#include <commctrl.h>
//#include "pm.h"
#include "winioctl.h"
#define MAX_LOADSTRING 100
#define ID_TRAY 1000
#define WM_TRAY_NOTIFY (WM_USER + 100)
#define MENU_OFFSCREEN 1
#define MENU_RESET 2
#define MENU_SHUTDOWN 3
#define MENU_EXIT 4
#define MENU_AUTORUN 5
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
// 全局變量:
HINSTANCE g_hInst = NULL; // 當前實例
HMENU g_hMenu = NULL; // 彈出菜單
HICON g_hIcon = NULL; // 托盤圖標
BOOL g_bAutoRun = FALSE; //是否開機啟動
TCHAR g_tszAppPath[MAX_PATH] = {0}; // 程序路徑
TCHAR g_tszLinkPath[MAX_PATH] = _T("\\Windows\\StartUp\\ShutWM.lnk");
// 此代碼模塊中包含的函數(shù)的前向聲明:
ATOM MyRegisterClass(HINSTANCE, LPTSTR);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL TrayMessage(HWND hwnd, UINT uMsg, UINT uID, HICON hIcon);
BOOL AppLinkExist();
void GenKeyEvent(BYTE bVkCode);
extern "C" __declspec(dllimport) BOOL KernelIoControl(
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned);
//extern "C" __declspec(dllimport) void FileSystemPowerFunction();
//extern "C" __declspec(dllimport) void PowerOffSystem();
//extern "C" BOOL ExitWindowsEx(UINT uFlags, DWORD dwReason);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
// 執(zhí)行應用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
// 主消息循環(huán):
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = g_hIcon;
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd = NULL;
TCHAR szTitle[MAX_LOADSTRING] = _T("ShutWM_sky"); // 標題欄文本
TCHAR szWindowClass[MAX_LOADSTRING] = _T("ShutWM_yks"); // 主窗口類名
g_hInst = hInstance; // 將實例句柄存儲在全局變量中
g_hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SHUTWM));
// 在應用程序初始化期間,應調(diào)用一次 SHInitExtraControls 以初始化
// 所有設(shè)備特定控件,例如,CAPEDIT 和 SIPPREF。
//SHInitExtraControls();
//如果它已經(jīng)在運行,則將焦點置于窗口上,然后退出
hWnd = FindWindow(szWindowClass, szTitle);
if (hWnd)
{
// 將焦點置于最前面的子窗口
// “| 0x00000001”用于將所有附屬窗口置于前臺并
// 激活這些窗口。
//SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
return FALSE;
}
if (!MyRegisterClass(hInstance, szWindowClass))
{
return FALSE;
}
hWnd = CreateWindow(szWindowClass, szTitle, ~WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//int wmId, wmEvent;
switch (message)
{
case WM_COMMAND:
{
//wmId = LOWORD(wParam);
//wmEvent = HIWORD(wParam);
// 分析菜單選擇:
switch (LOWORD(wParam))
{
case MENU_OFFSCREEN:
{
//GenKeyEvent(VK_F22);//鎖屏keylock
GenKeyEvent(VK_OFF);//關(guān)屏,會斷開AcitveSync
break;
}
case MENU_RESET:
{
//SetSystemPowerState(NULL, POWER_STATE_RESET, POWER_FORCE);//可以用
KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);//可以用
//FileSystemPowerFunction();//和下面一行一起使用
//PowerOffSystem();//暫不可以用
//ExitWindowsEx(EWX_REBOOT, 0);//可以用
break;
}
case MENU_SHUTDOWN:
{
//只是關(guān)屏,沒有關(guān)機
//SetSystemPowerState(NULL, POWER_STATE_OFF, POWER_FORCE);
//ExitWindowsEx(EWX_POWEROFF, 0);
break;
}
case MENU_EXIT:
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
case MENU_AUTORUN:
{
if (g_bAutoRun)
{
if (DeleteFile(g_tszLinkPath))
{
g_bAutoRun = FALSE;
}
}
else
{
TCHAR tszTempAppPath[MAX_PATH] = {0};
wsprintf(tszTempAppPath, _T("\"%s\""), g_tszAppPath);
if (SHCreateShortcut(g_tszLinkPath, tszTempAppPath))
{
g_bAutoRun = TRUE;
}
}
CheckMenuItem(g_hMenu, MENU_AUTORUN, g_bAutoRun?MF_CHECKED:MF_UNCHECKED);
break;
}
default:
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
}
case WM_CREATE:
{
GetModuleFileName(NULL, g_tszAppPath, MAX_PATH);
g_hMenu = CreatePopupMenu();
AppendMenu(g_hMenu, MF_STRING, MENU_OFFSCREEN, _T("關(guān)屏"));
AppendMenu(g_hMenu, MF_STRING, MENU_RESET, _T("重啟"));
//AppendMenu(g_hMenu, MF_STRING, MENU_SHUTDOWN, _T("關(guān)機"));
AppendMenu(g_hMenu, MF_STRING, MENU_EXIT, _T("退出"));
AppendMenu(g_hMenu, MF_SEPARATOR, NULL, _T(""));
UINT uFlag = MF_STRING;
if (AppLinkExist())
{
g_bAutoRun = TRUE;
uFlag |= MF_CHECKED;
}
else
{
g_bAutoRun = FALSE;
uFlag |= MF_UNCHECKED;
}
AppendMenu(g_hMenu, uFlag, MENU_AUTORUN, _T("開機啟動"));
TrayMessage(hWnd, NIM_ADD, ID_TRAY, g_hIcon);
break;
}
case WM_DESTROY:
{
DestroyMenu(g_hMenu);
TrayMessage(hWnd, NIM_DELETE, ID_TRAY, g_hIcon);
PostQuitMessage(0);
break;
}
case WM_TRAY_NOTIFY:
{
if (ID_TRAY == wParam && WM_LBUTTONUP == lParam)
{
TrackPopupMenu(g_hMenu, TPM_BOTTOMALIGN, GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN), 0, hWnd, NULL);
}
break;
}
default:
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
return 0;
}
BOOL TrayMessage(HWND hwnd, UINT uMsg, UINT uID, HICON hIcon)
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwnd;
nid.uID = uID;
nid.uFlags = NIF_MESSAGE|NIF_ICON;
nid.uCallbackMessage = WM_TRAY_NOTIFY;
nid.hIcon = hIcon;
nid.szTip[0] = '\0';
return Shell_NotifyIcon(uMsg, &nid);
}
BOOL AppLinkExist()
{
BOOL bExist = FALSE;
TCHAR tszLinkPath[MAX_PATH] = {0};
TCHAR tszTargetPath[MAX_PATH] = {0};
TCHAR tszTempApppath[MAX_PATH] = {0};
wsprintf(tszTempApppath, _T("\"%s\""), g_tszAppPath);
WIN32_FIND_DATA findData;
HANDLE hFile;
BOOL bFindFile = FALSE;
DWORD dwErrorCode = 0;
SetLastError(dwErrorCode);
hFile = FindFirstFile(_T("\\Windows\\StartUp\\*.lnk"), &findData);
while (INVALID_HANDLE_VALUE != hFile)
{
wsprintf(tszLinkPath, _T("%s%s"), _T("\\Windows\\StartUp\\"), findData.cFileName);
if (SHGetShortcutTarget(tszLinkPath, tszTargetPath, MAX_PATH))
{
if (0 == lstrcmp(tszTempApppath, tszTargetPath))
{
wcsncpy(g_tszLinkPath, tszLinkPath, MAX_PATH);
bExist = TRUE;
break;
}
}
bFindFile = FindNextFile(hFile, &findData);
if (!bFindFile)
{
dwErrorCode = GetLastError();
if (ERROR_NO_MORE_FILES == dwErrorCode)
{
break;
}
}
}
FindClose(hFile);
return bExist;
}
void GenKeyEvent(BYTE bVkCode)
{
keybd_event(bVkCode, 0, KEYEVENTF_SILENT, 0);
Sleep(100);
keybd_event(bVkCode, 0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -